abstractPreProcessingList = ClazzUtil.getSubClassList(AbstractPretreatment.class, true);
+ ByteBuf standardByteBuf = buffer;
+ for (AbstractPretreatment abstractPretreatment : abstractPreProcessingList) {
+ standardByteBuf = abstractPretreatment.decode(standardByteBuf);
}
- log.info(ByteBufUtil.hexDump(pretreatmentBuf));
+ log.info(ByteBufUtil.hexDump(standardByteBuf));
//这里可以增加一些前置处理,例如判断拆包合包等网络流的操作
ProtocolParser protocolParser = new GenericProtocolParser();
- ParseResult parseResult = protocolParser.doParseProtocol(pretreatmentBuf);
+ ParseResult parseResult = protocolParser.doParseProtocol(standardByteBuf);
//无论什么情况都交给,这里组装的内容,在回复的时候有效使用
list.add(parseResult);
}
/**
+ * 此方法废弃,暂做参考使用,byte的使用和帧结构构建例子
+ *
* 字节转换成对象
*
* @param buffer
@@ -58,6 +57,7 @@
* @return
* @throws UnsupportedEncodingException
*/
+ @Deprecated
private boolean transToMsg(ByteBuf buffer, Msg msg) throws UnsupportedEncodingException {
// byte[] bytes=new byte[buffer.readableBytes()];
diff --git a/sensorhub-core/pom.xml b/sensorhub-core/pom.xml
index 632d189..3ff3358 100644
--- a/sensorhub-core/pom.xml
+++ b/sensorhub-core/pom.xml
@@ -36,6 +36,12 @@
0.0.1-SNAPSHOT
+
+ net.jodah
+ expiringmap
+ 0.5.8
+
+
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java
index 5a44f3e..43bc4d4 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/SensorhubServer.java
@@ -56,9 +56,9 @@
* 启动sensorhub服务
*/
public void startServer() {
-// new Thread(new Runnable() {
-// @Override
-// public void run() {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
Integer port = sensorhubProperties.getPort();
if (port == null) {
log.info("sensorhub服务端口不能为空");
@@ -84,8 +84,8 @@
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
-// }
-// }).start();
+ }
+ }).start();
}
@PreDestroy
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java
index 7e8cb16..c3f82cc 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/netty/handler/SensorhubServerChannelInitialHandler.java
@@ -14,6 +14,8 @@
*/
public class SensorhubServerChannelInitialHandler extends ChannelInitializer {
+
+
@Override
protected void initChannel(SocketChannel socketChannel) {
ChannelPipeline pipeline = socketChannel.pipeline();
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
index eb167d6..afa062a 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/GenericProtocolParser.java
@@ -20,13 +20,14 @@
import java.util.Map;
/**
- * @author
+ * @author cz
+ * 通用的协议解析器,这里存在流程的主要解析流程
*/
@Slf4j
public class GenericProtocolParser extends ProtocolParserSupport implements ProtocolParser, ReplyCommandEnum {
/**
- * TO DO: 该集合用于数据报文的的数据解析
+ * todo: 标准数据报文的核心解析流程方法
* 1、前导码匹配报文协议
* 2、构建协议工厂(初始化获取与协议有关的数据库配置)
* 3、检测帧结构是否完整
@@ -36,7 +37,7 @@
* 7、构建回复需要的返回内容,为回复做准备
*
* @param byteBuf 报文内容
- * @return 构建回复需要的返回内容,为回复做准备
+ * @return 构建回复需要的返回内容,为回复handler准备相关命令
*/
@Override
public ParseResult doParseProtocol(ByteBuf byteBuf) {
@@ -44,7 +45,7 @@
ProtocolConfig protocolConfig = LeadingCodeMatcher.matchFrameLeadingCode(byteBuf);
//如果匹配不到前导码,则重置byteByf,判断是否是二次拆包发送,进行再次匹配
if (ObjectUtil.isEmpty(protocolConfig)) {
- return rematch(byteBuf);
+ return null;
}
//暂时先取第一个, 减少类的创建销毁与构建
AbstractProtocolConfigFactory protocolFactory = new DefaultProtocolConfigFactory(protocolConfig);
@@ -61,20 +62,20 @@
DatagramEventConfig datagramEventConfig = datagramEventProvider.getProcessorInstance();
//处理粘包拆包的主要组合
List frameStructDispenserList = ClazzUtil.getSubClassList(FrameStructMatcher.class, true);
- ByteBuf wholeNewPlainBuf = null;
+ ByteBuf intactMessageByte = null;
//通过匹配帧结构获取完整的数据包,验证是否是一个完整的帧结构
for (FrameStructMatcher frameStructMatcher : frameStructDispenserList) {
//帧结构该协议,经过帧结构判断选定帧协议完整的数据报文
- if ((wholeNewPlainBuf = frameStructMatcher.getWholeDatagram(byteBuf, protocolFactory, datagramEventConfig)) != null) {
+ if ((intactMessageByte = frameStructMatcher.getIntactMessageByte(byteBuf, protocolFactory, datagramEventConfig)) != null) {
break;
}
}
//没有匹配成功
- if (ObjectUtil.isEmpty(wholeNewPlainBuf)) {
+ if (ObjectUtil.isEmpty(intactMessageByte)) {
return ParseResult.builder().replyCommand(NONE_DATA).build();
}
//获取报文的业务内容
- ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(wholeNewPlainBuf);
+ ByteBuf bizDataByteBuf = protocolFactory.getProtocolFieldConfigProvider().getDataContentBuf(intactMessageByte);
//密文解析
ByteBuf clearZeroPlainBuf = datagramEventProvider.getSafeDatagram(bizDataByteBuf, ruleConfigFactory.getFieldConfigProvider().getFieldConfigsMap());
//解析组合业务字段
@@ -93,21 +94,4 @@
return result;
}
-
- /**
- * 如果是拆包序列2进入,需要重置byteBuf的读位置,进行重新匹配
- */
- private ParseResult rematch(ByteBuf byteBuf) {
- String oldDataContent = ByteBufUtil.hexDump(byteBuf);
- //重置位判断
- byteBuf.resetReaderIndex();
- //判断重置是否前移,如果没有前移,则直接判为匹配失败
- if (oldDataContent.equals(ByteBufUtil.hexDump(byteBuf))) {
- return ParseResult.builder().replyCommand(NONE_DATA).build();
- } else {
- //递归执行
- return doParseProtocol(byteBuf);
- }
- }
-
}
diff --git a/sensorhub-core/src/main/java/com/casic/missiles/parser/SensorhubDecoder.java b/sensorhub-core/src/main/java/com/casic/missiles/parser/SensorhubDecoder.java
index d13b643..b05b7ad 100644
--- a/sensorhub-core/src/main/java/com/casic/missiles/parser/SensorhubDecoder.java
+++ b/sensorhub-core/src/main/java/com/casic/missiles/parser/SensorhubDecoder.java
@@ -3,19 +3,17 @@
import com.casic.missiles.enums.FrameAttributeEnums;
import com.casic.missiles.enums.FrameStructEnum;
import com.casic.missiles.enums.OperatorTypeEnum;
-import com.casic.missiles.parser.predecodec.AbstractPreProcessing;
+import com.casic.missiles.parser.predecodec.AbstractPretreatment;
import com.casic.missiles.pojo.Msg;
import com.casic.missiles.pojo.ParseResult;
import com.casic.missiles.util.ClazzUtil;
import com.casic.missiles.util.MsgUtil;
-import com.casic.missiles.util.SpringContextUtil;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
-import sun.plugin2.gluegen.runtime.BufferFactory;
import java.io.UnsupportedEncodingException;
import java.util.List;
@@ -26,31 +24,32 @@
@Slf4j
public class SensorhubDecoder extends ByteToMessageDecoder {
- // 帧的最小长度
- private static final int MIN_FRAME_LEN = 22;
-
/**
- * 帧解析分为以下阶段
- * 1、帧前导码匹配
- * 2、帧规则解析
+ * todo: 自定义协议解析
+ * 帧解码分为以下阶段
+ * 1、帧预处理,判断是否是标准的报文结构,可以通过各个平台的特点,进行拦截预处理,同时根据特点进行处理粘包问题,获取标准的报文
+ * 2、将标准的报文,调用通用协议处理解析器,进行协议解析处理
+ * 3、将从通用的协议解析器得到的结果进行保存到list,传递给回复的handler,进行相关的回复命令操作
*/
@Override
protected void decode(ChannelHandlerContext ctx, ByteBuf buffer, List