| package com.doumee.jtt808.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.session.SessionManager; | 
| import org.springframework.beans.factory.annotation.Value; | 
| 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.protocol.codec.JTMessageAdapter; | 
| import com.doumee.jtt808.web.endpoint.JTHandlerInterceptor; | 
|   | 
| @Order(Integer.MIN_VALUE) | 
| @Configuration | 
| @ConditionalOnProperty(value = "jt-server.jt808.enable", havingValue = "true") | 
| public class JTConfig { | 
|   | 
|     private final JTMessageAdapter messageAdapter; | 
|     private final HandlerMapping handlerMapping; | 
|     private final JTHandlerInterceptor handlerInterceptor; | 
|     private final SessionManager sessionManager; | 
|   | 
|     public JTConfig(JTMessageAdapter messageAdapter, HandlerMapping handlerMapping, JTHandlerInterceptor handlerInterceptor, SessionManager sessionManager) { | 
|         this.messageAdapter = messageAdapter; | 
|         this.handlerMapping = handlerMapping; | 
|         this.handlerInterceptor = handlerInterceptor; | 
|         this.sessionManager = sessionManager; | 
|     } | 
|   | 
|     @ConditionalOnProperty(value = "jt-server.jt808.port.tcp") | 
|     @Bean(initMethod = "start", destroyMethod = "stop") | 
|     public Server jt808TCPServer(@Value("${jt-server.jt808.port.tcp}") int port) { | 
|         return NettyConfig.custom() | 
|                 //心跳超时(秒) | 
|                 .setIdleStateTime(180, 0, 0) | 
|                 .setPort(port) | 
|                 //标识位[2] + 消息头[21] + 消息体[1023 * 2(转义预留)]  + 校验码[1] + 标识位[2] | 
|                 .setMaxFrameLength(2 + 21 + 1023 * 3 + 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.port.udp") | 
|     @Bean(initMethod = "start", destroyMethod = "stop") | 
|     public Server jt808UDPServer(@Value("${jt-server.jt808.port.udp}") int port) { | 
|         return NettyConfig.custom() | 
|                 .setPort(port) | 
|                 .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.alarm-file.enable", havingValue = "true") | 
|     @Bean(initMethod = "start", destroyMethod = "stop") | 
|     public Server alarmFileServer(@Value("${jt-server.alarm-file.port}") int port, JTMessageAdapter alarmFileMessageAdapter) { | 
|         return NettyConfig.custom() | 
|                 .setPort(port) | 
|                 .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(); | 
|     } | 
| } |