diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java index 768eee8..e5fbc76 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java @@ -42,7 +42,7 @@ if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig); - if (upback == 1) {//使用esayRule + if (upback == 1){//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java index 768eee8..e5fbc76 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java @@ -42,7 +42,7 @@ if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig); - if (upback == 1) {//使用esayRule + if (upback == 1){//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java index db69283..fe9e8ba 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java @@ -6,7 +6,4 @@ void dataSenderSubscribe(Map bizDataMap, String protocolId); - - - } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java index 768eee8..e5fbc76 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java @@ -42,7 +42,7 @@ if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig); - if (upback == 1) {//使用esayRule + if (upback == 1){//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java index db69283..fe9e8ba 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java @@ -6,7 +6,4 @@ void dataSenderSubscribe(Map bizDataMap, String protocolId); - - - } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 7bc9244..90750c2 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -1,5 +1,5 @@ /** - * + * */ package com.casic.missiles.codec.encoder; @@ -9,130 +9,163 @@ import com.casic.missiles.enums.OperatorTypeEnum; import com.casic.missiles.utils.MsgUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import java.io.IOException; +import java.nio.charset.Charset; + /** * SensorhubEncoder 编码器 */ @Slf4j public class SensorhubEncoder extends MessageToByteEncoder { - @Override - protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { - if(isValid(msg)) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID + public static void main(String[] args) { + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + demoByte = demoByte.replace(" ", ""); +// try { +// byte[] bytes = hexByteList.getBytes("UTF8"); + ByteBuf out=ByteBufAllocator.DEFAULT.heapBuffer(); + out.writeBytes(hexBytes); +// System.out.println(hexBytes); + System.out.println(demoByte.length());//66 + System.out.println(ByteBufUtil.hexDump(out)); +// }catch (IOException ioe){ +// log.error("信息异常,异常信息为{}",ioe); +// } + } + + @Override + protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { + + if (isValid(msg)) { +// String hexBytes = "a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + //(井盖开机上报) + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + out.writeBytes(hexBytes); + // 设置前导码 +// byte preamble = (byte) 0xA3; +// out.writeByte(preamble); +// //设置版本号 +// out.writeByte(MsgUtil.getVersion(msg.getVersion())); +// // 设置长度 +// int leng = 0; +// OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); +// if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() +// || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() +// && StringUtils.isEmpty(msg.getTagList())) { +// leng = msg.getTagList().getBytes().length; +// } else { +// leng = msg.getOidList().getBytes().length; +// } +// out.writeBytes(MsgUtil.getLengByteArr(leng)); +// // 设置设备ID +//// out.writeBytes(msg.getDeviceId().getBytes()); +// out.writeBytes(new byte[6]); +// // 设置通信方式 +// out.writeByte(msg.getConnType()); +// // 设置目标节点地址 +//// out.writeBytes(msg.getDestAddr().getBytes()); +// out.writeBytes(new byte[2]); +// // 设置PDUType +// out.writeByte(msg.getOperateType()); +// out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); +// // 设置报文序号 +// out.writeByte(msg.getSeq()); +// // 设置协议内容 +// if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { +// out.writeBytes(msg.getTagList().getBytes()); +// } else { +// out.writeBytes(msg.getOidList().getBytes()); +// } +// // 设置CRC +// out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); +// +// msg.setTransControlFlag(1); +// writeMsg(msg, out); + } + } + + private void writeMsg(Msg msg, ByteBuf out) { + // 设置前导码 + byte preamble = (byte) 0xA3; + out.writeByte(preamble); + //设置版本号 + out.writeByte(MsgUtil.getVersion(msg.getVersion())); + // 设置长度 + int leng = 0; + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() + && StringUtils.isEmpty(msg.getTagList())) { + leng = msg.getTagList().getBytes().length; + } else { + leng = msg.getOidList().getBytes().length; + } + out.writeBytes(MsgUtil.getLengByteArr(leng)); + // 设置设备ID // out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 -// out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - -// msg.setTransControlFlag(1); -// writeMsg(msg, out); - } - } - - private void writeMsg (Msg msg, ByteBuf out) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID -// out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 + out.writeBytes(new byte[6]); + // 设置通信方式 + out.writeByte(msg.getConnType()); + // 设置目标节点地址 // out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - } + out.writeBytes(new byte[2]); + // 设置PDUType + out.writeByte(msg.getOperateType()); + out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); + // 设置报文序号 + out.writeByte(msg.getSeq()); + // 设置协议内容 + if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { + out.writeBytes(msg.getTagList().getBytes()); + } else { + out.writeBytes(msg.getOidList().getBytes()); + } - // 校验msg消息 - private boolean isValid (Msg msg) { - if(msg.getConnType() == null) { - log.error("通信方式不能为空"); - return false; - } - if(msg.getOperateType() == null) { - log.error("操作类型不能为空"); - return false; - } - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if(operatorTypeEnum == null) { - log.error("操作类型不合法"); - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getTagList())) { - log.error("tagList不能为空"); - return false; - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getOidList())) { - log.error("oidList不能为空"); - return false; - } + // 设置CRC + out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); + } - return true; - } + // 校验msg消息 + private boolean isValid(Msg msg) { + if (msg.getConnType() == null) { + log.error("通信方式不能为空"); + return false; + } + if (msg.getOperateType() == null) { + log.error("操作类型不能为空"); + return false; + } + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum == null) { + log.error("操作类型不合法"); + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getTagList())) { + log.error("tagList不能为空"); + return false; + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getOidList())) { + log.error("oidList不能为空"); + return false; + } + + return true; + } } \ No newline at end of file diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java index 768eee8..e5fbc76 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java @@ -42,7 +42,7 @@ if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig); - if (upback == 1) {//使用esayRule + if (upback == 1){//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java index db69283..fe9e8ba 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java @@ -6,7 +6,4 @@ void dataSenderSubscribe(Map bizDataMap, String protocolId); - - - } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 7bc9244..90750c2 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -1,5 +1,5 @@ /** - * + * */ package com.casic.missiles.codec.encoder; @@ -9,130 +9,163 @@ import com.casic.missiles.enums.OperatorTypeEnum; import com.casic.missiles.utils.MsgUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import java.io.IOException; +import java.nio.charset.Charset; + /** * SensorhubEncoder 编码器 */ @Slf4j public class SensorhubEncoder extends MessageToByteEncoder { - @Override - protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { - if(isValid(msg)) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID + public static void main(String[] args) { + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + demoByte = demoByte.replace(" ", ""); +// try { +// byte[] bytes = hexByteList.getBytes("UTF8"); + ByteBuf out=ByteBufAllocator.DEFAULT.heapBuffer(); + out.writeBytes(hexBytes); +// System.out.println(hexBytes); + System.out.println(demoByte.length());//66 + System.out.println(ByteBufUtil.hexDump(out)); +// }catch (IOException ioe){ +// log.error("信息异常,异常信息为{}",ioe); +// } + } + + @Override + protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { + + if (isValid(msg)) { +// String hexBytes = "a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + //(井盖开机上报) + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + out.writeBytes(hexBytes); + // 设置前导码 +// byte preamble = (byte) 0xA3; +// out.writeByte(preamble); +// //设置版本号 +// out.writeByte(MsgUtil.getVersion(msg.getVersion())); +// // 设置长度 +// int leng = 0; +// OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); +// if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() +// || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() +// && StringUtils.isEmpty(msg.getTagList())) { +// leng = msg.getTagList().getBytes().length; +// } else { +// leng = msg.getOidList().getBytes().length; +// } +// out.writeBytes(MsgUtil.getLengByteArr(leng)); +// // 设置设备ID +//// out.writeBytes(msg.getDeviceId().getBytes()); +// out.writeBytes(new byte[6]); +// // 设置通信方式 +// out.writeByte(msg.getConnType()); +// // 设置目标节点地址 +//// out.writeBytes(msg.getDestAddr().getBytes()); +// out.writeBytes(new byte[2]); +// // 设置PDUType +// out.writeByte(msg.getOperateType()); +// out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); +// // 设置报文序号 +// out.writeByte(msg.getSeq()); +// // 设置协议内容 +// if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { +// out.writeBytes(msg.getTagList().getBytes()); +// } else { +// out.writeBytes(msg.getOidList().getBytes()); +// } +// // 设置CRC +// out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); +// +// msg.setTransControlFlag(1); +// writeMsg(msg, out); + } + } + + private void writeMsg(Msg msg, ByteBuf out) { + // 设置前导码 + byte preamble = (byte) 0xA3; + out.writeByte(preamble); + //设置版本号 + out.writeByte(MsgUtil.getVersion(msg.getVersion())); + // 设置长度 + int leng = 0; + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() + && StringUtils.isEmpty(msg.getTagList())) { + leng = msg.getTagList().getBytes().length; + } else { + leng = msg.getOidList().getBytes().length; + } + out.writeBytes(MsgUtil.getLengByteArr(leng)); + // 设置设备ID // out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 -// out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - -// msg.setTransControlFlag(1); -// writeMsg(msg, out); - } - } - - private void writeMsg (Msg msg, ByteBuf out) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID -// out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 + out.writeBytes(new byte[6]); + // 设置通信方式 + out.writeByte(msg.getConnType()); + // 设置目标节点地址 // out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - } + out.writeBytes(new byte[2]); + // 设置PDUType + out.writeByte(msg.getOperateType()); + out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); + // 设置报文序号 + out.writeByte(msg.getSeq()); + // 设置协议内容 + if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { + out.writeBytes(msg.getTagList().getBytes()); + } else { + out.writeBytes(msg.getOidList().getBytes()); + } - // 校验msg消息 - private boolean isValid (Msg msg) { - if(msg.getConnType() == null) { - log.error("通信方式不能为空"); - return false; - } - if(msg.getOperateType() == null) { - log.error("操作类型不能为空"); - return false; - } - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if(operatorTypeEnum == null) { - log.error("操作类型不合法"); - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getTagList())) { - log.error("tagList不能为空"); - return false; - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getOidList())) { - log.error("oidList不能为空"); - return false; - } + // 设置CRC + out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); + } - return true; - } + // 校验msg消息 + private boolean isValid(Msg msg) { + if (msg.getConnType() == null) { + log.error("通信方式不能为空"); + return false; + } + if (msg.getOperateType() == null) { + log.error("操作类型不能为空"); + return false; + } + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum == null) { + log.error("操作类型不合法"); + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getTagList())) { + log.error("tagList不能为空"); + return false; + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getOidList())) { + log.error("oidList不能为空"); + return false; + } + + return true; + } } \ No newline at end of file diff --git a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java index b61ac4a..0f3864a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.domain.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface CommandEventMapper extends BaseMapper { } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java index 768eee8..e5fbc76 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java @@ -42,7 +42,7 @@ if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig); - if (upback == 1) {//使用esayRule + if (upback == 1){//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java index db69283..fe9e8ba 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java @@ -6,7 +6,4 @@ void dataSenderSubscribe(Map bizDataMap, String protocolId); - - - } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 7bc9244..90750c2 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -1,5 +1,5 @@ /** - * + * */ package com.casic.missiles.codec.encoder; @@ -9,130 +9,163 @@ import com.casic.missiles.enums.OperatorTypeEnum; import com.casic.missiles.utils.MsgUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import java.io.IOException; +import java.nio.charset.Charset; + /** * SensorhubEncoder 编码器 */ @Slf4j public class SensorhubEncoder extends MessageToByteEncoder { - @Override - protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { - if(isValid(msg)) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID + public static void main(String[] args) { + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + demoByte = demoByte.replace(" ", ""); +// try { +// byte[] bytes = hexByteList.getBytes("UTF8"); + ByteBuf out=ByteBufAllocator.DEFAULT.heapBuffer(); + out.writeBytes(hexBytes); +// System.out.println(hexBytes); + System.out.println(demoByte.length());//66 + System.out.println(ByteBufUtil.hexDump(out)); +// }catch (IOException ioe){ +// log.error("信息异常,异常信息为{}",ioe); +// } + } + + @Override + protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { + + if (isValid(msg)) { +// String hexBytes = "a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + //(井盖开机上报) + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + out.writeBytes(hexBytes); + // 设置前导码 +// byte preamble = (byte) 0xA3; +// out.writeByte(preamble); +// //设置版本号 +// out.writeByte(MsgUtil.getVersion(msg.getVersion())); +// // 设置长度 +// int leng = 0; +// OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); +// if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() +// || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() +// && StringUtils.isEmpty(msg.getTagList())) { +// leng = msg.getTagList().getBytes().length; +// } else { +// leng = msg.getOidList().getBytes().length; +// } +// out.writeBytes(MsgUtil.getLengByteArr(leng)); +// // 设置设备ID +//// out.writeBytes(msg.getDeviceId().getBytes()); +// out.writeBytes(new byte[6]); +// // 设置通信方式 +// out.writeByte(msg.getConnType()); +// // 设置目标节点地址 +//// out.writeBytes(msg.getDestAddr().getBytes()); +// out.writeBytes(new byte[2]); +// // 设置PDUType +// out.writeByte(msg.getOperateType()); +// out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); +// // 设置报文序号 +// out.writeByte(msg.getSeq()); +// // 设置协议内容 +// if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { +// out.writeBytes(msg.getTagList().getBytes()); +// } else { +// out.writeBytes(msg.getOidList().getBytes()); +// } +// // 设置CRC +// out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); +// +// msg.setTransControlFlag(1); +// writeMsg(msg, out); + } + } + + private void writeMsg(Msg msg, ByteBuf out) { + // 设置前导码 + byte preamble = (byte) 0xA3; + out.writeByte(preamble); + //设置版本号 + out.writeByte(MsgUtil.getVersion(msg.getVersion())); + // 设置长度 + int leng = 0; + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() + && StringUtils.isEmpty(msg.getTagList())) { + leng = msg.getTagList().getBytes().length; + } else { + leng = msg.getOidList().getBytes().length; + } + out.writeBytes(MsgUtil.getLengByteArr(leng)); + // 设置设备ID // out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 -// out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - -// msg.setTransControlFlag(1); -// writeMsg(msg, out); - } - } - - private void writeMsg (Msg msg, ByteBuf out) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID -// out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 + out.writeBytes(new byte[6]); + // 设置通信方式 + out.writeByte(msg.getConnType()); + // 设置目标节点地址 // out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - } + out.writeBytes(new byte[2]); + // 设置PDUType + out.writeByte(msg.getOperateType()); + out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); + // 设置报文序号 + out.writeByte(msg.getSeq()); + // 设置协议内容 + if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { + out.writeBytes(msg.getTagList().getBytes()); + } else { + out.writeBytes(msg.getOidList().getBytes()); + } - // 校验msg消息 - private boolean isValid (Msg msg) { - if(msg.getConnType() == null) { - log.error("通信方式不能为空"); - return false; - } - if(msg.getOperateType() == null) { - log.error("操作类型不能为空"); - return false; - } - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if(operatorTypeEnum == null) { - log.error("操作类型不合法"); - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getTagList())) { - log.error("tagList不能为空"); - return false; - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getOidList())) { - log.error("oidList不能为空"); - return false; - } + // 设置CRC + out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); + } - return true; - } + // 校验msg消息 + private boolean isValid(Msg msg) { + if (msg.getConnType() == null) { + log.error("通信方式不能为空"); + return false; + } + if (msg.getOperateType() == null) { + log.error("操作类型不能为空"); + return false; + } + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum == null) { + log.error("操作类型不合法"); + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getTagList())) { + log.error("tagList不能为空"); + return false; + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getOidList())) { + log.error("oidList不能为空"); + return false; + } + + return true; + } } \ No newline at end of file diff --git a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java index b61ac4a..0f3864a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.domain.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface CommandEventMapper extends BaseMapper { } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java index 145708d..f6bf951 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.domain.RuleDict; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface RuleDictMapper extends BaseMapper { } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java index 768eee8..e5fbc76 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java @@ -42,7 +42,7 @@ if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig); - if (upback == 1) {//使用esayRule + if (upback == 1){//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java index db69283..fe9e8ba 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java @@ -6,7 +6,4 @@ void dataSenderSubscribe(Map bizDataMap, String protocolId); - - - } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 7bc9244..90750c2 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -1,5 +1,5 @@ /** - * + * */ package com.casic.missiles.codec.encoder; @@ -9,130 +9,163 @@ import com.casic.missiles.enums.OperatorTypeEnum; import com.casic.missiles.utils.MsgUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import java.io.IOException; +import java.nio.charset.Charset; + /** * SensorhubEncoder 编码器 */ @Slf4j public class SensorhubEncoder extends MessageToByteEncoder { - @Override - protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { - if(isValid(msg)) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID + public static void main(String[] args) { + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + demoByte = demoByte.replace(" ", ""); +// try { +// byte[] bytes = hexByteList.getBytes("UTF8"); + ByteBuf out=ByteBufAllocator.DEFAULT.heapBuffer(); + out.writeBytes(hexBytes); +// System.out.println(hexBytes); + System.out.println(demoByte.length());//66 + System.out.println(ByteBufUtil.hexDump(out)); +// }catch (IOException ioe){ +// log.error("信息异常,异常信息为{}",ioe); +// } + } + + @Override + protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { + + if (isValid(msg)) { +// String hexBytes = "a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + //(井盖开机上报) + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + out.writeBytes(hexBytes); + // 设置前导码 +// byte preamble = (byte) 0xA3; +// out.writeByte(preamble); +// //设置版本号 +// out.writeByte(MsgUtil.getVersion(msg.getVersion())); +// // 设置长度 +// int leng = 0; +// OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); +// if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() +// || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() +// && StringUtils.isEmpty(msg.getTagList())) { +// leng = msg.getTagList().getBytes().length; +// } else { +// leng = msg.getOidList().getBytes().length; +// } +// out.writeBytes(MsgUtil.getLengByteArr(leng)); +// // 设置设备ID +//// out.writeBytes(msg.getDeviceId().getBytes()); +// out.writeBytes(new byte[6]); +// // 设置通信方式 +// out.writeByte(msg.getConnType()); +// // 设置目标节点地址 +//// out.writeBytes(msg.getDestAddr().getBytes()); +// out.writeBytes(new byte[2]); +// // 设置PDUType +// out.writeByte(msg.getOperateType()); +// out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); +// // 设置报文序号 +// out.writeByte(msg.getSeq()); +// // 设置协议内容 +// if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { +// out.writeBytes(msg.getTagList().getBytes()); +// } else { +// out.writeBytes(msg.getOidList().getBytes()); +// } +// // 设置CRC +// out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); +// +// msg.setTransControlFlag(1); +// writeMsg(msg, out); + } + } + + private void writeMsg(Msg msg, ByteBuf out) { + // 设置前导码 + byte preamble = (byte) 0xA3; + out.writeByte(preamble); + //设置版本号 + out.writeByte(MsgUtil.getVersion(msg.getVersion())); + // 设置长度 + int leng = 0; + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() + && StringUtils.isEmpty(msg.getTagList())) { + leng = msg.getTagList().getBytes().length; + } else { + leng = msg.getOidList().getBytes().length; + } + out.writeBytes(MsgUtil.getLengByteArr(leng)); + // 设置设备ID // out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 -// out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - -// msg.setTransControlFlag(1); -// writeMsg(msg, out); - } - } - - private void writeMsg (Msg msg, ByteBuf out) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID -// out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 + out.writeBytes(new byte[6]); + // 设置通信方式 + out.writeByte(msg.getConnType()); + // 设置目标节点地址 // out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - } + out.writeBytes(new byte[2]); + // 设置PDUType + out.writeByte(msg.getOperateType()); + out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); + // 设置报文序号 + out.writeByte(msg.getSeq()); + // 设置协议内容 + if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { + out.writeBytes(msg.getTagList().getBytes()); + } else { + out.writeBytes(msg.getOidList().getBytes()); + } - // 校验msg消息 - private boolean isValid (Msg msg) { - if(msg.getConnType() == null) { - log.error("通信方式不能为空"); - return false; - } - if(msg.getOperateType() == null) { - log.error("操作类型不能为空"); - return false; - } - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if(operatorTypeEnum == null) { - log.error("操作类型不合法"); - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getTagList())) { - log.error("tagList不能为空"); - return false; - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getOidList())) { - log.error("oidList不能为空"); - return false; - } + // 设置CRC + out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); + } - return true; - } + // 校验msg消息 + private boolean isValid(Msg msg) { + if (msg.getConnType() == null) { + log.error("通信方式不能为空"); + return false; + } + if (msg.getOperateType() == null) { + log.error("操作类型不能为空"); + return false; + } + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum == null) { + log.error("操作类型不合法"); + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getTagList())) { + log.error("tagList不能为空"); + return false; + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getOidList())) { + log.error("oidList不能为空"); + return false; + } + + return true; + } } \ No newline at end of file diff --git a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java index b61ac4a..0f3864a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.domain.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface CommandEventMapper extends BaseMapper { } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java index 145708d..f6bf951 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.domain.RuleDict; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface RuleDictMapper extends BaseMapper { } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java b/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java index 3057ceb..323a2e7 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java @@ -10,7 +10,7 @@ @Data @Builder public class NodeDecoratorParm { - String ruletypeId; + private String ruletypeId; private String contents; private String dynamicContent; private Map ruleDictMap; diff --git a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java index 9478fd7..9bbd6da 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/SensorhubServerApplication.java @@ -27,4 +27,5 @@ public void run(String... args) { this.nettyServer.startServer(); } + } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java index 6949ba0..b1faa52 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/SensorhubDecoder.java @@ -31,7 +31,6 @@ // 可读长度必须大于帧的最小长度 if (buffer.readableBytes() >= MIN_FRAME_LEN){ // 记录包头开始的index - int beginReader = buffer.readerIndex(); ProtocolSelector protocolSelector = (ProtocolSelector) ApplicationContextUtil.getBean("standardSelector"); Boolean protocolFlag = protocolSelector.selectorProvider(buffer); // 标记包头开始的index diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java index 468b10d..3172bee 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/processor/CodeGeneratorProvider.java @@ -61,7 +61,7 @@ //需要加密 SafeStrategy safeStrategy = (SafeStrategy) ApplicationContextUtil.getBean(safeName); String lightText=""; -// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); +// String lightText = safeStrategy.decryption(bizDataContent.toString(Charset.forName("ISO-8859-1"))); return lightText; } return bizDataContent.toString(Charset.forName("ISO-8859-1")); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java index 62838d8..24b9188 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldParser.java @@ -15,7 +15,6 @@ Map dataParser(RuleConfig ruleConfig, String lightText); - Integer getTotalLength(ProtocolConfig protocolConfig, ByteBuf byteBuf); ByteBuf getDataContent(ProtocolConfig protocolConfig, ByteBuf buffer); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java index 21733b1..09e03af 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/FieldResolverManger.java @@ -11,6 +11,7 @@ import io.netty.buffer.ByteBufUtil; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; @@ -35,31 +36,49 @@ if (fieldConfig.getOffsetLength() == 1) { fieldValue = bitToResolver(byteBuf, fieldConfig); } else { - ByteBuf fieldBytes = byteBuf.slice(orignPosition, orignPosition + fieldConfig.getOffsetLength()); - fieldValue = fieldsResolveBuilder(fieldBytes, fieldConfig.getRuleJson()); + ByteBuf fieldBytes = byteBuf.slice(orignPosition, fieldConfig.getOffsetLength()); + fieldValue = fieldsResolveManger(fieldBytes, fieldConfig.getRuleJson()); } - ByteBufUtil.hexDump(byteBuf); return fieldValue; } + //存在rule_json走自定义的规则设置,没有则支持默认配置的规则设置, + //目前默认配置的规则设置暂不支持配置化,由实现完成 + private Object fieldsResolveManger(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 String fieldsResolveBuilder(ByteBuf byteBuf, String ruleJson) { - Object mergeValue = new Object(); + private Object customizeResolveBuilder(ByteBuf byteBuf, List ruleMapList) { + Object customizeResolveValue = null; try { - List ruleMapList = JSONArray.parseArray(ruleJson, Map.class); 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()) { + while (!ObjectUtil.isEmpty(ruleMapList) && i < ruleMapList.size()) { if (ruleMapList.get(i).get("ruleType").equals("logicalShift")) { String ruletypeId = String.valueOf(ruleMapList.get(i).get("ruleTypeId")); - mergeValue = byteMergeProvider.resolveByteMerge(bytStrList,ruletypeId); + customizeResolveValue = byteMergeProvider.resolveByteMerge(bytStrList, ruletypeId); break; } else { String vaildRange = String.valueOf(ruleMapList.get(i).get("vaildRange")); @@ -67,7 +86,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(k) .value(bytStrList.get(k)) .ruletypeId(ruletypeId).build(); @@ -78,21 +97,21 @@ i++; } //字节归并到一起=>继续根据规则进行判断 - while (i < ruleMapList.size()) { + 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) - .value(mergeValue) + .value(customizeResolveValue) .ruletypeId(ruletypeId).build(); - mergeValue = byteResolverBean.resolveOperationRule(byteResolverParam); + customizeResolveValue = byteResolverBean.resolveOperationRule(byteResolverParam); i++; } - System.out.println(JSON.toJSON(mergeValue)); - return String.valueOf(mergeValue); + System.out.println(JSON.toJSON(customizeResolveValue)); + return customizeResolveValue; } catch (Exception ex) { - log.error("字段解析byte位出现异常,解析内容为{},解析规则为{},异常信息为{}", mergeValue, ruleJson, ex.getMessage()); + log.error("自定义字段解析byte位出现异常,解析规则内容为{},异常信息为{}", JSONObject.toJSON(ruleMapList), ex.getMessage()); return null; } } @@ -101,7 +120,7 @@ * 1、单个字节情况表示字段 * 2、多字节情况表示字段(暂未处理) */ - private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { + private Object bitToResolver(ByteBuf byteBuf, FieldConfig fieldConfig) { Object fieldValue = new Object(); try { Integer orignPosition = Integer.valueOf(fieldConfig.getOrignPosition()); @@ -132,7 +151,7 @@ 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() + ByteResolverParam byteResolverParam = ByteResolverParam.builder() .index(null) .value(fieldValue) .ruletypeId(ruletypeId).build(); diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java index c4faf9d..d91f67a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/resolver/impl/StandardFieldParser.java @@ -63,7 +63,7 @@ totalFilterLength += fieldConfig.getOffsetLength(); } } - totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig) + totalFilterLength; + totalLength =(Integer) fieldResolverManger.filedParserManger(byteBuf, totalFieldConfig)+ totalFilterLength; } catch (Exception ex) { log.error("报文确认分发阶段,获取报文总长度异常,协议内容{},异常信息{}", JSONObject.toJSON(protocolConfig), ex.getMessage()); } @@ -80,8 +80,8 @@ // Integer totalLength = this.getTotalLength(protocolConfig, buffer); Integer totalLength = lightText.length(); Integer maxFixedPosition = calculatePosition(fieldConfigList); - buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); - ByteBuf bizDataFields = buffer.slice(maxFixedPosition, maxFixedPosition + (totalLength - fixedLength) + 1); + buffer.slice(maxFixedPosition, (totalLength - fixedLength)).toString(Charset.forName("ISO-8859-1")); + ByteBuf bizDataFields = buffer.slice(maxFixedPosition, (totalLength - fixedLength) + 1); return bizDataFields; } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java index 768eee8..e5fbc76 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/selector/impl/dispenser/impl/FrameMarkDispenser.java @@ -42,7 +42,7 @@ if (!ObjectUtil.isEmpty(UnpackConfig)) { while (hasNextFullFrame(byteBuf, protocolConfig)) { upback = (Integer) fieldResolverManger.filedParserManger(byteBuf, UnpackConfig); - if (upback == 1) {//使用esayRule + if (upback == 1){//使用esayRule //表示可以截取 cutOffPackageBuilder(byteBuf, protocolConfig, totalLength); if (byteBuf.hasArray()) { diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java index db69283..fe9e8ba 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/decoder/sender/DataSubscribeProvider.java @@ -6,7 +6,4 @@ void dataSenderSubscribe(Map bizDataMap, String protocolId); - - - } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java index 7bc9244..90750c2 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/codec/encoder/SensorhubEncoder.java @@ -1,5 +1,5 @@ /** - * + * */ package com.casic.missiles.codec.encoder; @@ -9,130 +9,163 @@ import com.casic.missiles.enums.OperatorTypeEnum; import com.casic.missiles.utils.MsgUtil; import io.netty.buffer.ByteBuf; +import io.netty.buffer.ByteBufAllocator; +import io.netty.buffer.ByteBufUtil; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.MessageToByteEncoder; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; +import java.io.IOException; +import java.nio.charset.Charset; + /** * SensorhubEncoder 编码器 */ @Slf4j public class SensorhubEncoder extends MessageToByteEncoder { - @Override - protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { - if(isValid(msg)) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID + public static void main(String[] args) { + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + String demoByte="a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + demoByte = demoByte.replace(" ", ""); +// try { +// byte[] bytes = hexByteList.getBytes("UTF8"); + ByteBuf out=ByteBufAllocator.DEFAULT.heapBuffer(); + out.writeBytes(hexBytes); +// System.out.println(hexBytes); + System.out.println(demoByte.length());//66 + System.out.println(ByteBufUtil.hexDump(out)); +// }catch (IOException ioe){ +// log.error("信息异常,异常信息为{}",ioe); +// } + } + + @Override + protected void encode(ChannelHandlerContext ctx, Msg msg, ByteBuf out) throws Exception { + + if (isValid(msg)) { +// String hexBytes = "a3 20 00 35 41 20 18 47 00 aa 03 00 aa 08 86 01 15 c8 a8 b8 74 2e 08 13 be 51 34 b4 12 08 6d b0 ed 7e 89 d4 92 2c 5c 24 ea aa 0e da c3 89 9b b2 a2 5e c6 68 8d 41 86 fe 73 a1 75 37 2f 7c ab d7 ac c8"; + //(井盖开机上报) + byte[] hexBytes = {(byte)0xa3,0x20,0x00,0x35,0x41,0x20,0x18,0x47,0x00,(byte)0xaa,0x03,0x00,(byte)0xaa,0x08,(byte)0x86,0x01,0x15,(byte)0xc8 + ,(byte)0xa8,(byte)0xb8,0x74,0x2e,0x08,0x13,(byte)0xbe,0x51,0x34,(byte)0xb4,0x12,0x08,0x6d,(byte)0xb0,(byte)0xed,0x7e,(byte)0x89, + (byte)0xd4,(byte)0x92,0x2c,0x5c,0x24,(byte)0xea,(byte)0xaa,0x0e,(byte)0xda,(byte)0xc3,(byte)0x89,(byte)0x9b,(byte)0xb2,(byte)0xa2,0x5e, + (byte)0xc6,0x68,(byte)0x8d,0x41,(byte)0x86,(byte)0xfe,0x73,(byte)0xa1,0x75,0x37,0x2f,0x7c,(byte)0xab,(byte)0xd7,(byte)0xac,(byte)0xc8}; + out.writeBytes(hexBytes); + // 设置前导码 +// byte preamble = (byte) 0xA3; +// out.writeByte(preamble); +// //设置版本号 +// out.writeByte(MsgUtil.getVersion(msg.getVersion())); +// // 设置长度 +// int leng = 0; +// OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); +// if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() +// || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() +// && StringUtils.isEmpty(msg.getTagList())) { +// leng = msg.getTagList().getBytes().length; +// } else { +// leng = msg.getOidList().getBytes().length; +// } +// out.writeBytes(MsgUtil.getLengByteArr(leng)); +// // 设置设备ID +//// out.writeBytes(msg.getDeviceId().getBytes()); +// out.writeBytes(new byte[6]); +// // 设置通信方式 +// out.writeByte(msg.getConnType()); +// // 设置目标节点地址 +//// out.writeBytes(msg.getDestAddr().getBytes()); +// out.writeBytes(new byte[2]); +// // 设置PDUType +// out.writeByte(msg.getOperateType()); +// out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); +// // 设置报文序号 +// out.writeByte(msg.getSeq()); +// // 设置协议内容 +// if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { +// out.writeBytes(msg.getTagList().getBytes()); +// } else { +// out.writeBytes(msg.getOidList().getBytes()); +// } +// // 设置CRC +// out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); +// +// msg.setTransControlFlag(1); +// writeMsg(msg, out); + } + } + + private void writeMsg(Msg msg, ByteBuf out) { + // 设置前导码 + byte preamble = (byte) 0xA3; + out.writeByte(preamble); + //设置版本号 + out.writeByte(MsgUtil.getVersion(msg.getVersion())); + // 设置长度 + int leng = 0; + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() + && StringUtils.isEmpty(msg.getTagList())) { + leng = msg.getTagList().getBytes().length; + } else { + leng = msg.getOidList().getBytes().length; + } + out.writeBytes(MsgUtil.getLengByteArr(leng)); + // 设置设备ID // out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 -// out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - -// msg.setTransControlFlag(1); -// writeMsg(msg, out); - } - } - - private void writeMsg (Msg msg, ByteBuf out) { - // 设置前导码 - byte preamble = (byte)0xA3; - out.writeByte(preamble); - //设置版本号 - out.writeByte(MsgUtil.getVersion(msg.getVersion())); - // 设置长度 - int leng = 0; - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if (operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue() - && StringUtils.isEmpty(msg.getTagList())) { - leng = msg.getTagList().getBytes().length; - } else { - leng = msg.getOidList().getBytes().length; - } - out.writeBytes(MsgUtil.getLengByteArr(leng)); - // 设置设备ID -// out.writeBytes(msg.getDeviceId().getBytes()); - out.writeBytes(new byte[6]); - // 设置通信方式 - out.writeByte(msg.getConnType()); - // 设置目标节点地址 + out.writeBytes(new byte[6]); + // 设置通信方式 + out.writeByte(msg.getConnType()); + // 设置目标节点地址 // out.writeBytes(msg.getDestAddr().getBytes()); - out.writeBytes(new byte[2]); - // 设置PDUType - out.writeByte(msg.getOperateType()); - out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); - // 设置报文序号 - out.writeByte(msg.getSeq()); - // 设置协议内容 - if(MsgUtil.isTagFrameStruct(msg.getOperateType())) { - out.writeBytes(msg.getTagList().getBytes()); - } else { - out.writeBytes(msg.getOidList().getBytes()); - } - // 设置CRC - out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); - } + out.writeBytes(new byte[2]); + // 设置PDUType + out.writeByte(msg.getOperateType()); + out.writeByte(MsgUtil.getPDUTypeLowByte(msg.getTransControlFlag(), msg.getDeviceType())); + // 设置报文序号 + out.writeByte(msg.getSeq()); + // 设置协议内容 + if (MsgUtil.isTagFrameStruct(msg.getOperateType())) { + out.writeBytes(msg.getTagList().getBytes()); + } else { + out.writeBytes(msg.getOidList().getBytes()); + } - // 校验msg消息 - private boolean isValid (Msg msg) { - if(msg.getConnType() == null) { - log.error("通信方式不能为空"); - return false; - } - if(msg.getOperateType() == null) { - log.error("操作类型不能为空"); - return false; - } - OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); - if(operatorTypeEnum == null) { - log.error("操作类型不合法"); - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() - || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getTagList())) { - log.error("tagList不能为空"); - return false; - } - if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) - && StringUtils.isEmpty(msg.getOidList())) { - log.error("oidList不能为空"); - return false; - } + // 设置CRC + out.writeBytes(new byte[FrameAttributeEnums.CRC.getLength()]); + } - return true; - } + // 校验msg消息 + private boolean isValid(Msg msg) { + if (msg.getConnType() == null) { + log.error("通信方式不能为空"); + return false; + } + if (msg.getOperateType() == null) { + log.error("操作类型不能为空"); + return false; + } + OperatorTypeEnum operatorTypeEnum = OperatorTypeEnum.getEnumByOperatorType(msg.getOperateType()); + if (operatorTypeEnum == null) { + log.error("操作类型不合法"); + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_LIST_STRUCT.getValue() + || operatorTypeEnum.getFrameStuct() == FrameStructEnum.TAG_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getTagList())) { + log.error("tagList不能为空"); + return false; + } + if ((operatorTypeEnum.getFrameStuct() == FrameStructEnum.OID_LIST_STRUCT.getValue()) + && StringUtils.isEmpty(msg.getOidList())) { + log.error("oidList不能为空"); + return false; + } + + return true; + } } \ No newline at end of file diff --git a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java index b61ac4a..0f3864a 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/mapper/CommandEventMapper.java @@ -2,7 +2,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.domain.CommandEventConfig; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface CommandEventMapper extends BaseMapper { } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java b/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java index 145708d..f6bf951 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/mapper/RuleDictMapper.java @@ -2,6 +2,8 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.casic.missiles.domain.RuleDict; +import org.apache.ibatis.annotations.Mapper; +@Mapper public interface RuleDictMapper extends BaseMapper { } diff --git a/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java b/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java index 3057ceb..323a2e7 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/model/NodeDecoratorParm.java @@ -10,7 +10,7 @@ @Data @Builder public class NodeDecoratorParm { - String ruletypeId; + private String ruletypeId; private String contents; private String dynamicContent; private Map ruleDictMap; diff --git a/sensorhub-server/src/main/java/com/casic/missiles/server/delivery/service/impl/ComandeEventServiceImpl.java b/sensorhub-server/src/main/java/com/casic/missiles/server/delivery/service/impl/ComandeEventServiceImpl.java index d08fb89..3ade950 100644 --- a/sensorhub-server/src/main/java/com/casic/missiles/server/delivery/service/impl/ComandeEventServiceImpl.java +++ b/sensorhub-server/src/main/java/com/casic/missiles/server/delivery/service/impl/ComandeEventServiceImpl.java @@ -44,6 +44,4 @@ return commandConfigMap; } - - }