Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

182 lines
6.7KB

  1. package com.telpo.beidouast.handler;
  2. import com.telpo.beidouast.enums.DipperReturnValue;
  3. import com.telpo.beidouast.service.IDipperAstPosAsyncTaskService;
  4. import com.telpo.beidouast.service.IDipperAstTimeAsyncTaskService;
  5. import com.telpo.beidouast.service.IDipperDataAsyncTaskService;
  6. import io.netty.buffer.ByteBuf;
  7. import io.netty.buffer.Unpooled;
  8. import io.netty.channel.socket.SocketChannel;
  9. import io.netty.channel.ChannelHandlerContext;
  10. import io.netty.channel.ChannelInboundHandlerAdapter;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import java.io.InputStream;
  15. import java.time.LocalDateTime;
  16. /**
  17. * @program: dipperposition
  18. * @description: Netty服务器处理句柄
  19. * @author: linwl
  20. * @create: 2021-01-13 13:56
  21. **/
  22. @Slf4j
  23. public class NettyServerHandler extends ChannelInboundHandlerAdapter {
  24. private static String AST_TIME_CMD = "54494d45";
  25. private static String AST_POS_CMD = "504f53";
  26. private static String AST_EPH_CMD = "455048";
  27. @Autowired
  28. private IDipperAstTimeAsyncTaskService dipperTimeAsyncTaskService;
  29. @Autowired
  30. private IDipperAstPosAsyncTaskService dipperAstPosAsyncTaskService;
  31. @Autowired
  32. private IDipperDataAsyncTaskService dipperDataAsyncTaskService;
  33. @Value(value = "${position-server.timeAsycPort}")
  34. private String timeAsycServerPort;
  35. @Value(value = "${position-server.posAsycPort}")
  36. private String posAsycServerPort;
  37. @Value(value = "${position-server.starsAsycPort}")
  38. private String starsAsycServerPort;
  39. @Value("${pos.centerProvinceFilePath}")
  40. String centerProvinceFilePath;
  41. @Value("${pos.ipPositionRequestPath}")
  42. String ipPositionRequestPath;
  43. @Value("${pos.ipPositionRequestKey}")
  44. String ipPositionRequestKey;
  45. @Value("${pos.centerProvince}")
  46. String centerProvince;
  47. @Value("${pos.ast.server}")
  48. String astServer;
  49. @Value("${pos.ast.posAstPort}")
  50. int posAstPort;
  51. @Value("${pos.ast.timeout}")
  52. int astTimeout;
  53. /**
  54. * 客户端连接会触发
  55. */
  56. @Override
  57. public void channelActive(ChannelHandlerContext ctx) throws Exception {
  58. log.info("Channel active......");
  59. SocketChannel channel = (SocketChannel) ctx.channel();
  60. log.info("链接报告开始");
  61. log.info("链接报告信息:有一客户端链接到本服务端");
  62. log.info("链接报告IP:" + channel.localAddress().getHostString());
  63. log.info("链接报告Port:" + channel.localAddress().getPort());
  64. log.info("链接报告完毕");
  65. //通知客户端链接建立成功
  66. // 默认返回取得时间成功
  67. String ackAckCheckRef = "233E0101020004020A1D";
  68. if (Integer.parseInt(posAsycServerPort) == channel.localAddress().getPort()) {
  69. ackAckCheckRef = "233E010102000401091C";
  70. }
  71. if (Integer.parseInt(starsAsycServerPort) == channel.localAddress().getPort()) {
  72. ackAckCheckRef = "233E010102000421293C";
  73. }
  74. //String str = "通知客户端链接建立成功" + " " + LocalDateTime.now() + " " + channel.localAddress().getHostString() +
  75. // "\r\n";
  76. ByteBuf buf = Unpooled.buffer(ackAckCheckRef.getBytes().length);
  77. buf.writeBytes(ackAckCheckRef.getBytes("GBK"));
  78. ctx.writeAndFlush(buf);
  79. }
  80. /**
  81. * 当客户端主动断开服务端的链接后,这个通道就是不活跃的。也就是说客户端与服务端的关闭了通信通道并且不可以传输数据
  82. */
  83. @Override
  84. public void channelInactive(ChannelHandlerContext ctx) throws Exception {
  85. log.info("客户端断开链接,IP:{}", ctx.channel().localAddress().toString());
  86. }
  87. /**
  88. * 客户端发消息会触发
  89. */
  90. @Override
  91. public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
  92. //接收msg消息{与上一章节相比,此处已经不需要自己进行解码}
  93. SocketChannel channel = (SocketChannel) ctx.channel();
  94. String ipAddress = channel.remoteAddress().toString();
  95. String message = " 接收到消息:{0}, 客户端IP:{1}";
  96. log.info(message ,msg, ipAddress);
  97. String channelAns = "";
  98. // 返回时间指令
  99. //if (Integer.parseInt(timeAsycServerPort) == channel.localAddress().getPort()) {
  100. ByteBuf recvmg = (ByteBuf) msg;
  101. ByteBuf buf = null;
  102. String recvmgStr = recvmg.toString();
  103. if (AST_TIME_CMD.equals(recvmg)) {
  104. // 初始时间辅助输入;
  105. channelAns = dipperTimeAsyncTaskService.pushAstTime();
  106. buf = Unpooled.buffer(channelAns.getBytes().length);
  107. }
  108. // 发送SDBP-AST-POS获取辅助位置信息
  109. // if (Integer.parseInt(posAsycServerPort) == channel.localAddress().getPort()) {
  110. if (AST_POS_CMD.equals(recvmg)) {
  111. channelAns = dipperAstPosAsyncTaskService.pushAstPos(ipAddress,
  112. centerProvinceFilePath,
  113. centerProvince,
  114. ipPositionRequestPath,
  115. ipPositionRequestKey);
  116. buf = Unpooled.buffer(channelAns.getBytes().length);
  117. }
  118. // 从缓存获取SDBP-AST-EPH星历数
  119. //if (Integer.parseInt(starsAsycServerPort) == channel.localAddress().getPort()) {
  120. if (AST_POS_CMD.equals(recvmg)) {
  121. String astEPHBytes = dipperDataAsyncTaskService.getAstEPH();
  122. buf = Unpooled.buffer(astEPHBytes.getBytes().length);
  123. }
  124. // 最后把SDBP-AST-TIME、SDBP-AST-POS、SDBP-AST-EPH并包一起发给设备。
  125. // 设备采用16进制获取数据,则代理服务器也是采用16进制返回数据。
  126. // 通知客户端链消息发送成功
  127. // String str = "服务端收到:" + LocalDateTime.now() + " " + msg + "\r\n";
  128. buf.writeBytes(channelAns.getBytes("GBK"));
  129. ctx.writeAndFlush(buf);
  130. //ctx.write("你也好哦");
  131. //ctx.flush();
  132. }
  133. // @Override
  134. // public void channelRead0(ChannelHandlerContext ctx, HttpObject msg)
  135. // throws Exception {
  136. // if (msg instanceof HttpRequest) {
  137. // HttpRequest mReq = (HttpRequest) msg;
  138. // String clientIP = mReq.headers().get("X-Forwarded-For");
  139. // if (clientIP == null) {
  140. // InetSocketAddress insocket = (InetSocketAddress) ctx.channel()
  141. // .remoteAddress();
  142. // clientIP = insocket.getAddress().getHostAddress();
  143. // }
  144. // }
  145. // }
  146. /**
  147. * 发生异常触发
  148. */
  149. @Override
  150. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  151. cause.printStackTrace();
  152. ctx.close();
  153. }
  154. }