MessageHandler.java 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package com.zksy.manhole.utils;
  2. import com.zksy.common.exception.InvalidMessageException;
  3. import com.zksy.manhole.domain.ManholeData;
  4. import com.zksy.manhole.service.ManholeDataService;
  5. import io.netty.buffer.ByteBuf;
  6. import io.netty.buffer.Unpooled;
  7. import io.netty.channel.ChannelHandler;
  8. import io.netty.channel.ChannelHandlerContext;
  9. import io.netty.channel.ChannelInboundHandlerAdapter;
  10. import io.netty.handler.timeout.ReadTimeoutException;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Component;
  16. import java.util.Date;
  17. @ChannelHandler.Sharable
  18. @Slf4j
  19. @Component
  20. public class MessageHandler extends ChannelInboundHandlerAdapter {
  21. private static Logger logger = LoggerFactory.getLogger(MessageHandler.class);
  22. private final ManholeDataService messageParseResultService;
  23. @Autowired
  24. private DeviceOfflineCheckTask deviceOfflineCheckTask;
  25. public MessageHandler(ManholeDataService messageParseResultService) {
  26. this.messageParseResultService = messageParseResultService;
  27. }
  28. @Override
  29. public void channelRead(ChannelHandlerContext ctx, Object msg) {
  30. try {
  31. ByteBuf msgByteBuf = (ByteBuf) msg;
  32. if (msgByteBuf == null || !msgByteBuf.isReadable()) {
  33. logger.warn("接收到无效的消息");
  34. return;
  35. }
  36. logger.info("接收到 {} 字节的数据,来自: {}", msgByteBuf.readableBytes(), ctx.channel().remoteAddress());
  37. byte[] msgBytes = new byte[msgByteBuf.readableBytes()];
  38. msgByteBuf.readBytes(msgBytes);
  39. String result = printHexBinary(msgBytes);
  40. String msgString = result.replaceAll("\\s", "");
  41. String CRCString = msgString.substring(msgString.length() - 4);
  42. String bodyResult = msgString.substring(0, msgString.length() - 4);
  43. String codeString = DataCheckUtil.crc16(bodyResult);
  44. System.out.println("校验码:" + CRCString + "-----------生成的校验码:" + codeString);
  45. if (!CRCString.equals(codeString)) {
  46. throw new InvalidMessageException("数据校验不成功");
  47. } else {
  48. ManholeData resultData = DataParser.parseMessage(msgString);
  49. // 更新设备最后一次接收数据的时间,并标记设备在线
  50. String imeiCardNumber = resultData.getImeiCardNumber();
  51. DeviceOfflineCheckTask.deviceLastReceiveTimeMap.put(imeiCardNumber, new Date());
  52. deviceOfflineCheckTask.markDeviceOnline(imeiCardNumber);
  53. messageParseResultService.saveManholeData(resultData);
  54. }
  55. } catch (InvalidMessageException e) {
  56. logger.error("数据入库失败: {}", e.getMessage());
  57. ctx.writeAndFlush(Unpooled.copiedBuffer("数据入库失败".getBytes()));
  58. }
  59. }
  60. private String printHexBinary(byte[] bytes) {
  61. StringBuilder sb = new StringBuilder();
  62. for (byte b : bytes) {
  63. sb.append(String.format("%02X ", b));
  64. }
  65. System.out.println("Received raw data: " + sb.toString());
  66. logger.info("Received raw data: " + sb.toString());
  67. return sb.toString();
  68. }
  69. @Override
  70. public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
  71. if (cause instanceof ReadTimeoutException) {
  72. logger.info("来自" + ctx.channel().remoteAddress() + "的连接超时断开");
  73. } else {
  74. cause.printStackTrace();
  75. logger.info("来自" + ctx.channel().remoteAddress() + "的连接异常断开");
  76. ctx.close();
  77. }
  78. }
  79. @Override
  80. public void channelReadComplete(ChannelHandlerContext ctx) throws Exception {
  81. ctx.flush();
  82. }
  83. @Override
  84. public void channelUnregistered(ChannelHandlerContext ctx) throws Exception {
  85. logger.info("来自" + ctx.channel().remoteAddress() + "的连接主动断开");
  86. ctx.fireChannelUnregistered();
  87. }
  88. }