diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index f9fb380..5226924 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -3,6 +3,7 @@ import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -28,7 +29,7 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 @@ -41,7 +42,6 @@ continue; } String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String validRange = String.valueOf(ruleMap.get("validRange")); String ruleType = String.valueOf(ruleMap.get("ruleType")); //合并规则进行执行字段合并 switch (ruleType) { @@ -51,13 +51,15 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); + tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } break; case "decorate": List decorateByteBufList = new ArrayList<>(); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { - decorateByteBufList.add(DecorateResolver.resolveRule(null)); + decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } break; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index f9fb380..5226924 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -3,6 +3,7 @@ import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -28,7 +29,7 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 @@ -41,7 +42,6 @@ continue; } String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String validRange = String.valueOf(ruleMap.get("validRange")); String ruleType = String.valueOf(ruleMap.get("ruleType")); //合并规则进行执行字段合并 switch (ruleType) { @@ -51,13 +51,15 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); + tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } break; case "decorate": List decorateByteBufList = new ArrayList<>(); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { - decorateByteBufList.add(DecorateResolver.resolveRule(null)); + decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } break; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java index 4317516..3f4a219 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -26,16 +26,14 @@ * 数值的转换 * 混合运算,有常量或者乘除的缩放 */ - public static Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { try { if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } String expression = fieldRuleEngine.getExpression(); Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); + env2.put("value", value); value = String.valueOf(AviatorEvaluator.execute(expression, env2)); return value; } catch (ExpressionNotFoundException enf) { @@ -45,5 +43,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index f9fb380..5226924 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -3,6 +3,7 @@ import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -28,7 +29,7 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 @@ -41,7 +42,6 @@ continue; } String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String validRange = String.valueOf(ruleMap.get("validRange")); String ruleType = String.valueOf(ruleMap.get("ruleType")); //合并规则进行执行字段合并 switch (ruleType) { @@ -51,13 +51,15 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); + tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } break; case "decorate": List decorateByteBufList = new ArrayList<>(); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { - decorateByteBufList.add(DecorateResolver.resolveRule(null)); + decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } break; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java index 4317516..3f4a219 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -26,16 +26,14 @@ * 数值的转换 * 混合运算,有常量或者乘除的缩放 */ - public static Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { try { if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } String expression = fieldRuleEngine.getExpression(); Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); + env2.put("value", value); value = String.valueOf(AviatorEvaluator.execute(expression, env2)); return value; } catch (ExpressionNotFoundException enf) { @@ -45,5 +43,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index d2eed15..b1a09f9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -3,10 +3,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -17,7 +19,7 @@ * @author cz */ @Slf4j -public class BitFieldParser extends GenericRuleResolver { +public class BitFieldParser extends GenericFiledRuleResolver { /** * todo: 位字段解析 @@ -25,6 +27,44 @@ * 2、多字节情况表示字段(暂未处理) */ public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { + + Object fieldsResolveValue = null; + String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + fieldsResolveValue = defaultBitResolve(binaryStr); + } else { + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + } + return fieldsResolveValue; + } + + /** + * 默认的bit解析 + * + * @param binaryStr + * @return + */ + private static Object defaultBitResolve(String binaryStr) { + Object fieldValue = new Object(); + fieldValue = Integer.parseInt(binaryStr, 2); + return fieldValue; + } + + /** + * 自定义规则解析 + * + * @return + */ + private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(binaryBytes); + return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + } + + + private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -43,32 +83,29 @@ binaryStr = getBinaryStrFromByte(fields) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); - fieldValue = Integer.parseInt(binaryStr, 2); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); -// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); -// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); -// ByteResolverParam byteResolverParam = ByteResolverParam.builder() -// .index(null) -// .value(fieldValue) -// .ruleTypeId(ruleTypeId).build(); -// fieldValue = byteResolverBean.resolveRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; + return binaryStr; } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } } + + /** + * todo: 从二进制字符串转为byte[] + * + * @param binaryStr + * @return + */ + private static byte[] getBytesFromBinaryStr(String binaryStr) { + byte[] bytes = new byte[binaryStr.length() / 8]; + for (int i = 0; i < binaryStr.length() / 8; i++) { + byte currentStrByte = Byte.parseByte(binaryStr.substring(i * 8, (i + 1) * 8), 2); + bytes[i] = currentStrByte; + } + return bytes; + } + /** * 把byte转化成2进制字符串 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index f9fb380..5226924 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -3,6 +3,7 @@ import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -28,7 +29,7 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 @@ -41,7 +42,6 @@ continue; } String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String validRange = String.valueOf(ruleMap.get("validRange")); String ruleType = String.valueOf(ruleMap.get("ruleType")); //合并规则进行执行字段合并 switch (ruleType) { @@ -51,13 +51,15 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); + tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } break; case "decorate": List decorateByteBufList = new ArrayList<>(); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { - decorateByteBufList.add(DecorateResolver.resolveRule(null)); + decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } break; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java index 4317516..3f4a219 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -26,16 +26,14 @@ * 数值的转换 * 混合运算,有常量或者乘除的缩放 */ - public static Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { try { if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } String expression = fieldRuleEngine.getExpression(); Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); + env2.put("value", value); value = String.valueOf(AviatorEvaluator.execute(expression, env2)); return value; } catch (ExpressionNotFoundException enf) { @@ -45,5 +43,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index d2eed15..b1a09f9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -3,10 +3,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -17,7 +19,7 @@ * @author cz */ @Slf4j -public class BitFieldParser extends GenericRuleResolver { +public class BitFieldParser extends GenericFiledRuleResolver { /** * todo: 位字段解析 @@ -25,6 +27,44 @@ * 2、多字节情况表示字段(暂未处理) */ public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { + + Object fieldsResolveValue = null; + String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + fieldsResolveValue = defaultBitResolve(binaryStr); + } else { + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + } + return fieldsResolveValue; + } + + /** + * 默认的bit解析 + * + * @param binaryStr + * @return + */ + private static Object defaultBitResolve(String binaryStr) { + Object fieldValue = new Object(); + fieldValue = Integer.parseInt(binaryStr, 2); + return fieldValue; + } + + /** + * 自定义规则解析 + * + * @return + */ + private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(binaryBytes); + return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + } + + + private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -43,32 +83,29 @@ binaryStr = getBinaryStrFromByte(fields) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); - fieldValue = Integer.parseInt(binaryStr, 2); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); -// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); -// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); -// ByteResolverParam byteResolverParam = ByteResolverParam.builder() -// .index(null) -// .value(fieldValue) -// .ruleTypeId(ruleTypeId).build(); -// fieldValue = byteResolverBean.resolveRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; + return binaryStr; } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } } + + /** + * todo: 从二进制字符串转为byte[] + * + * @param binaryStr + * @return + */ + private static byte[] getBytesFromBinaryStr(String binaryStr) { + byte[] bytes = new byte[binaryStr.length() / 8]; + for (int i = 0; i < binaryStr.length() / 8; i++) { + byte currentStrByte = Byte.parseByte(binaryStr.substring(i * 8, (i + 1) * 8), 2); + bytes[i] = currentStrByte; + } + return bytes; + } + /** * 把byte转化成2进制字符串 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 0ba53c0..7ed1f42 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,25 +1,12 @@ 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.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteUtil; -import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.util.SpringContextUtil; -import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,7 +14,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends GenericRuleResolver { +public class ByteFieldParser extends GenericFiledRuleResolver { /** @@ -42,9 +29,9 @@ Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,98 +43,11 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } - /** - * todo: 定制化的字段解析器 - *

- * 1、字节字段解析构建器 - * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 - * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 - * 4、字节归并结束或者规则结束=>继续根据规则进行判断 - * - * @param byteBuf - * @param ruleMapList - * @return - */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { - //16进制的字符串 - Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - - int i = 0; - //通过类型可以控制aviator入参出参的数据 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (!ruleMapList.get(i).containsKey("ruleTypeId")) { - i++; - continue; - } - String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并规则进行执行字段合并 -// if (ruleMapList.get(i).get("ruleType").equals("combine")) { -// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); -// break; -// } else { -// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); -// 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.resolveRule(byteResolverParam)); -// } -// bytStrList = tempBytStr; -// } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - if (CollectionUtils.isNotEmpty(ruleMapList)) { - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("validRange")) { - continue; - } - String validRange = String.valueOf(ruleMap.get("validRange")); - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); -// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); -// ByteResolverParam byteResolverParam = ByteResolverParam.builder() -// .index(null) -// .value(ruleResolveValue) -// .ruleTypeId(ruleTypeId).build(); -// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); - } - } - System.out.println(JSON.toJSON(ruleResolveValue)); - return ruleResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - public static void main(String[] args) { - String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); - byteBuf.writeBytes(Hex.decode(hexStr)); - System.out.println(byteBuf.toString(Charset.defaultCharset())); - Long longData = (long) byteBuf.getByte(0) & 0xff; - int intData = (int) byteBuf.getByte(0) & 0xff; - System.out.println(intData); - System.out.println(longData); - - Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); - // byte进行数值转换 - // 下面的解析就剩 加减缩放、值合并这两个,精度 - } } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java index f9fb380..5226924 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/GenericFiledRuleResolver.java @@ -3,6 +3,7 @@ import com.casic.missiles.parser.resolver.bytes.ByteMergeResolver; import com.casic.missiles.parser.resolver.bytes.ByteTypeResolver; import com.casic.missiles.parser.resolver.bytes.DecorateResolver; +import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; @@ -28,7 +29,7 @@ * 值运算包括值缩放、格式转换、精度运算 * 这是一般的运算流程 */ - public static Object resolveFieldRule(ByteBuf byteBuf, List ruleMapList) { + public static Object doResolveFieldByteRule(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { Object resolveRuleValue = ByteBufUtil.hexDump(byteBuf); List byteBufList = new ArrayList<>(); //存放到数组里面 @@ -41,7 +42,6 @@ continue; } String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); - String validRange = String.valueOf(ruleMap.get("validRange")); String ruleType = String.valueOf(ruleMap.get("ruleType")); //合并规则进行执行字段合并 switch (ruleType) { @@ -51,13 +51,15 @@ case "typeConvert": List tempByteBufList = new ArrayList<>(); for (Object object : byteBufList) { - tempByteBufList.add(ByteTypeResolver.resolveRule(object, ruleTypeId)); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); + tempByteBufList.add(ByteTypeResolver.resolveRule(object, fieldRuleConfig.getExpression())); } break; case "decorate": List decorateByteBufList = new ArrayList<>(); + FieldRuleConfig fieldRuleConfig=fieldRuleConfigMap.get(ruleTypeId); for (Object object : byteBufList) { - decorateByteBufList.add(DecorateResolver.resolveRule(null)); + decorateByteBufList.add(DecorateResolver.resolveRule(object,fieldRuleConfig)); } break; } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java index 4317516..3f4a219 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/bytes/DecorateResolver.java @@ -26,16 +26,14 @@ * 数值的转换 * 混合运算,有常量或者乘除的缩放 */ - public static Object resolveRule(ByteResolverParam byteResolverParam) { - FieldRuleConfig fieldRuleEngine = new FieldRuleConfig(); - Object value = byteResolverParam.getValue(); + public static Object resolveRule(Object value, FieldRuleConfig fieldRuleEngine) { try { if (ObjectUtil.isEmpty(fieldRuleEngine)) { return value; } String expression = fieldRuleEngine.getExpression(); Map env2 = new HashMap(); - env2.put("value", Double.valueOf(value.toString())); + env2.put("value", value); value = String.valueOf(AviatorEvaluator.execute(expression, env2)); return value; } catch (ExpressionNotFoundException enf) { @@ -45,5 +43,4 @@ } - } diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java index d2eed15..b1a09f9 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/BitFieldParser.java @@ -3,10 +3,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; -import com.casic.missiles.parser.rule.GenericRuleResolver; +import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.AbstractFieldConfig; import com.casic.missiles.pojo.FieldRuleConfig; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; @@ -17,7 +19,7 @@ * @author cz */ @Slf4j -public class BitFieldParser extends GenericRuleResolver { +public class BitFieldParser extends GenericFiledRuleResolver { /** * todo: 位字段解析 @@ -25,6 +27,44 @@ * 2、多字节情况表示字段(暂未处理) */ public static Object doParseBitField(ByteBuf byteBuf, AbstractFieldConfig fieldConfig, Map fieldRuleConfigMap) { + + Object fieldsResolveValue = null; + String binaryStr = convertBinaryStr(byteBuf, fieldConfig); + if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { + fieldsResolveValue = defaultBitResolve(binaryStr); + } else { + List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); + fieldsResolveValue = doResolveFieldBitRule(binaryStr, ruleMapList, fieldRuleConfigMap); + } + return fieldsResolveValue; + } + + /** + * 默认的bit解析 + * + * @param binaryStr + * @return + */ + private static Object defaultBitResolve(String binaryStr) { + Object fieldValue = new Object(); + fieldValue = Integer.parseInt(binaryStr, 2); + return fieldValue; + } + + /** + * 自定义规则解析 + * + * @return + */ + private static Object doResolveFieldBitRule(String binaryStr, List ruleMapList, Map fieldRuleConfigMap) { + byte[] binaryBytes = getBytesFromBinaryStr(binaryStr); + ByteBuf byteBuf = ByteBufAllocator.DEFAULT.buffer(); + byteBuf.writeBytes(binaryBytes); + return doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); + } + + + private static String convertBinaryStr(ByteBuf byteBuf, AbstractFieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer originPosition = Integer.valueOf(fieldConfig.getOriginPositionByte()); @@ -43,32 +83,29 @@ binaryStr = getBinaryStrFromByte(fields) + binaryStr; } binaryStr = binaryStr.substring(fieldConfig.getOriginPositionBit(), fieldConfig.getOriginPositionBit() + fieldConfig.getOffsetLength()); - fieldValue = Integer.parseInt(binaryStr, 2); - if (StringUtils.isEmpty(fieldConfig.getRuleJson())) { - return fieldValue; - } - List ruleMapList = JSONArray.parseArray(fieldConfig.getRuleJson(), Map.class); - int i = 0; - //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { - String validRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); -// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); -// String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); -// ByteResolverParam byteResolverParam = ByteResolverParam.builder() -// .index(null) -// .value(fieldValue) -// .ruleTypeId(ruleTypeId).build(); -// fieldValue = byteResolverBean.resolveRule(byteResolverParam); - i++; - } - System.out.println(JSON.toJSON(fieldValue)); - return fieldValue; + return binaryStr; } catch (RuntimeException ex) { log.error("字段解析bit位出现异常,解析内容为{},解析规则内容为{},异常信息为{}", fieldValue, JSONObject.toJSON(fieldConfig), ex.getMessage()); return null; } } + + /** + * todo: 从二进制字符串转为byte[] + * + * @param binaryStr + * @return + */ + private static byte[] getBytesFromBinaryStr(String binaryStr) { + byte[] bytes = new byte[binaryStr.length() / 8]; + for (int i = 0; i < binaryStr.length() / 8; i++) { + byte currentStrByte = Byte.parseByte(binaryStr.substring(i * 8, (i + 1) * 8), 2); + bytes[i] = currentStrByte; + } + return bytes; + } + /** * 把byte转化成2进制字符串 */ diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java index 0ba53c0..7ed1f42 100644 --- a/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java +++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/resolver/fields/ByteFieldParser.java @@ -1,25 +1,12 @@ 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.baomidou.mybatisplus.core.toolkit.CollectionUtils; -import com.casic.missiles.parser.resolver.ByteUtil; -import com.casic.missiles.parser.rule.GenericRuleResolver; -import com.casic.missiles.pojo.ByteResolverParam; +import com.casic.missiles.parser.resolver.GenericFiledRuleResolver; import com.casic.missiles.pojo.FieldRuleConfig; -import com.casic.missiles.util.SpringContextUtil; -import com.googlecode.aviator.AviatorEvaluator; import io.netty.buffer.ByteBuf; -import io.netty.buffer.ByteBufAllocator; -import io.netty.buffer.ByteBufUtil; import lombok.extern.slf4j.Slf4j; -import org.bouncycastle.util.encoders.Hex; -import java.nio.charset.Charset; -import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; @@ -27,7 +14,7 @@ * @author cz */ @Slf4j -public class ByteFieldParser extends GenericRuleResolver { +public class ByteFieldParser extends GenericFiledRuleResolver { /** @@ -42,9 +29,9 @@ Object fieldsResolveValue = null; List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); if (CollectionUtils.isEmpty(ruleMapList)) { - fieldsResolveValue = defaultResolve(byteBuf); + fieldsResolveValue = defaultResolve(byteBuf); } else { - fieldsResolveValue = customizeResolve(byteBuf, ruleMapList, fieldRuleConfigMap); + fieldsResolveValue = doResolveFieldByteRule(byteBuf, ruleMapList, fieldRuleConfigMap); } return fieldsResolveValue; } @@ -56,98 +43,11 @@ * @return */ private static Object defaultResolve(ByteBuf byteBuf) { - Integer defaultResolveValue = 0; + Integer defaultResolveValue = 0; for (int i = 0; i < byteBuf.writerIndex(); i++) { defaultResolveValue = defaultResolveValue << 8 | (int) byteBuf.readByte() & 0xff; } return defaultResolveValue; } - /** - * todo: 定制化的字段解析器 - *

- * 1、字节字段解析构建器 - * 2、获取解析数组,查询规则,通过相应的规则转换器,进行规则解析 - * 3、直到规则解析结束或者遇到字节归并规则进行字节数据统一 - * 4、字节归并结束或者规则结束=>继续根据规则进行判断 - * - * @param byteBuf - * @param ruleMapList - * @return - */ - private static Object customizeResolve(ByteBuf byteBuf, List ruleMapList, Map fieldRuleConfigMap) { - //16进制的字符串 - Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); - try { - List bytStrList = new ArrayList<>(); - //存放到数组里面 - for (int i = 0; i < byteBuf.writerIndex(); i++) { - bytStrList.add(byteBuf.readByte()); - } - - int i = 0; - //通过类型可以控制aviator入参出参的数据 - while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { - if (!ruleMapList.get(i).containsKey("ruleTypeId")) { - i++; - continue; - } - String ruleTypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - String validRange = String.valueOf(ruleMapList.get(i).get("validRange")); - //合并规则进行执行字段合并 -// if (ruleMapList.get(i).get("ruleType").equals("combine")) { -// ruleResolveValue = resolveByteMerge(bytStrList, ruleTypeId, validRange); -// break; -// } else { -// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); -// 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.resolveRule(byteResolverParam)); -// } -// bytStrList = tempBytStr; -// } - i++; - } - //字节归并到一起=>继续根据规则进行判断 - if (CollectionUtils.isNotEmpty(ruleMapList)) { - for (Map ruleMap : ruleMapList) { - if (!ruleMap.containsKey("validRange")) { - continue; - } - String validRange = String.valueOf(ruleMap.get("validRange")); - String ruleTypeId = String.valueOf(ruleMap.get("ruleTypeId")); -// ByteResolver byteResolverBean = SpringContextUtil.getBean(validRange); -// ByteResolverParam byteResolverParam = ByteResolverParam.builder() -// .index(null) -// .value(ruleResolveValue) -// .ruleTypeId(ruleTypeId).build(); -// ruleResolveValue = byteResolverBean.resolveRule(byteResolverParam); - } - } - System.out.println(JSON.toJSON(ruleResolveValue)); - return ruleResolveValue; - } catch (RuntimeException ex) { - log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); - return null; - } - } - - public static void main(String[] args) { - String hexStr = "9949524D4D2D5254553130304E5F4150505F76352E30"; - ByteBuf byteBuf = ByteBufAllocator.DEFAULT.heapBuffer(); - byteBuf.writeBytes(Hex.decode(hexStr)); - System.out.println(byteBuf.toString(Charset.defaultCharset())); - Long longData = (long) byteBuf.getByte(0) & 0xff; - int intData = (int) byteBuf.getByte(0) & 0xff; - System.out.println(intData); - System.out.println(longData); - - Object ruleResolveValue = ByteBufUtil.hexDump(byteBuf); - // byte进行数值转换 - // 下面的解析就剩 加减缩放、值合并这两个,精度 - } } 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 index fa97915..c19c573 100644 --- 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 @@ -35,6 +35,7 @@ try { if (fieldConfig.getOffsetUnit().equals("bit")) { fieldValue = BitFieldParser.doParseBitField(byteBuf, fieldConfig,fieldRuleConfigMap); + } else { ByteBuf fieldBytes = byteBuf.slice(originPosition, fieldConfig.getOffsetLength()); fieldBytes.resetReaderIndex();