package org.yzh.web.config; import io.github.yezhihao.netmc.NettyConfig; import io.github.yezhihao.netmc.Server; import io.github.yezhihao.netmc.codec.Delimiter; import io.github.yezhihao.netmc.codec.LengthField; import io.github.yezhihao.netmc.core.HandlerMapping; import io.github.yezhihao.netmc.core.SpringHandlerMapping; import io.github.yezhihao.netmc.session.SessionListener; import io.github.yezhihao.netmc.session.SessionManager; import io.github.yezhihao.protostar.SchemaManager; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; import org.yzh.commons.spring.SSEService; import org.yzh.protocol.codec.*; import org.yzh.web.endpoint.JTHandlerInterceptor; import org.yzh.web.endpoint.JTMessagePushAdapter; import org.yzh.web.endpoint.JTMultiPacketListener; import org.yzh.web.model.enums.SessionKey; @Order(Integer.MIN_VALUE) @Configuration @ConditionalOnProperty(value = "jt-server.jt808.enabled", havingValue = "true", matchIfMissing = true) public class JTConfig { @ConditionalOnProperty(value = "jt-server.jt808.tcp-port") @Bean(initMethod = "start", destroyMethod = "stop") public Server jt808TCPServer(JTMessageAdapter messageAdapter, HandlerMapping handlerMapping, JTHandlerInterceptor handlerInterceptor, SessionManager sessionManager, JTProperties jtProperties) { return NettyConfig.custom() .setIdleStateTime(jtProperties.getIdleTimeout(), 0, 0) .setPort(jtProperties.getTcpPort()) //标识位[2] + 消息头[21] + 消息体[1023 * 2(转义预留)] + 校验码[1] + 标识位[2] .setMaxFrameLength(2 + 21 + 1023 * 2 + 1 + 2) .setDelimiters(new Delimiter(new byte[]{0x7e}, false)) .setDecoder(messageAdapter) .setEncoder(messageAdapter) .setHandlerMapping(handlerMapping) .setHandlerInterceptor(handlerInterceptor) .setSessionManager(sessionManager) .setName("808-TCP") .build(); } @ConditionalOnProperty(value = "jt-server.jt808.udp-port") @Bean(initMethod = "start", destroyMethod = "stop") public Server jt808UDPServer(JTMessageAdapter messageAdapter, HandlerMapping handlerMapping, JTHandlerInterceptor handlerInterceptor, SessionManager sessionManager, JTProperties jtProperties) { return NettyConfig.custom() .setPort(jtProperties.getUdpPort()) .setDelimiters(new Delimiter(new byte[]{0x7e}, false)) .setDecoder(messageAdapter) .setEncoder(messageAdapter) .setHandlerMapping(handlerMapping) .setHandlerInterceptor(handlerInterceptor) .setSessionManager(sessionManager) .setName("808-UDP") .setEnableUDP(true) .build(); } @ConditionalOnProperty(value = "jt-server.jt808.t9208.enabled", havingValue = "true") @Bean(initMethod = "start", destroyMethod = "stop") public Server alarmFileServer(HandlerMapping handlerMapping, JTHandlerInterceptor handlerInterceptor, SchemaManager schemaManager, SSEService sseService, JTProperties jtProperties) { JTMessageEncoder encoder = new JTMessageEncoder(schemaManager); JTMessageDecoder decoder = new DataFrameMessageDecoder(schemaManager, new byte[]{0x30, 0x31, 0x63, 0x64}); JTMessagePushAdapter alarmFileMessageAdapter = new JTMessagePushAdapter(encoder, decoder, sseService); return NettyConfig.custom() .setPort(jtProperties.getT9208().getPort()) .setMaxFrameLength(2 + 21 + 1023 * 2 + 1 + 2) .setLengthField(new LengthField(new byte[]{0x30, 0x31, 0x63, 0x64}, 1024 * 65, 58, 4)) .setDelimiters(new Delimiter(new byte[]{0x7e}, false)) .setDecoder(alarmFileMessageAdapter) .setEncoder(alarmFileMessageAdapter) .setHandlerMapping(handlerMapping) .setHandlerInterceptor(handlerInterceptor) .setName("AlarmFile") .build(); } @Bean public JTMessageAdapter jtMessageAdapter(SchemaManager schemaManager, SSEService sseService) { JTMessageEncoder messageEncoder = new JTMessageEncoder(schemaManager); JTMessageDecoder messageDecoder = new MultiPacketDecoder(schemaManager, new JTMultiPacketListener(10)); return new JTMessagePushAdapter(messageEncoder, messageDecoder, sseService); } @Bean public HandlerMapping handlerMapping() { return new SpringHandlerMapping(); } @Bean public SessionManager sessionManager(SessionListener sessionListener) { return new SessionManager(SessionKey.class, sessionListener); } @Bean public SchemaManager schemaManager(JTProperties jtProperties) { return new SchemaManager(jtProperties.getMessagePackage()); } @Bean public MultiPacketDecoder multiPacketDecoder(SchemaManager schemaManager) { return new MultiPacketDecoder(schemaManager); } }