ChargeMessageDecoder.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package com.zhili.stationcontrol.chargeserver.handler;
  2. import com.zhili.stationcontrol.chargeserver.dto.ChargeMessage;
  3. import com.zhili.stationcontrol.util.BytesUtil;
  4. import io.netty.buffer.ByteBuf;
  5. import io.netty.channel.ChannelHandlerContext;
  6. import io.netty.handler.codec.ByteToMessageDecoder;
  7. import lombok.extern.slf4j.Slf4j;
  8. import org.apache.commons.lang.ArrayUtils;
  9. import java.util.List;
  10. /**
  11. * @author :HuangBin
  12. * @description:TODO
  13. * @date :2022/10/24 10:41
  14. */
  15. @Slf4j
  16. public class ChargeMessageDecoder extends ByteToMessageDecoder {
  17. public static final byte[] START = {(byte) 0xaa, (byte) 0xf5};
  18. public static final int baseLen = 9;
  19. @Override
  20. protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf byteBuf, List<Object> list) throws Exception {
  21. while (byteBuf.readableBytes() >= START.length) {
  22. // 寻找头部
  23. byteBuf.markReaderIndex();
  24. byte[] start = new byte[START.length];
  25. byteBuf.readBytes(start);
  26. if (start[0] == START[0] && start[1] == START[1]) {
  27. //如果读到头部,继续解析
  28. if (byteBuf.readableBytes() >= 2) {
  29. //解析长度
  30. byte[] lenBytes = new byte[2];
  31. byteBuf.readBytes(lenBytes);
  32. int len = BytesUtil.toIntWithLowerFirst(lenBytes);
  33. if (byteBuf.readableBytes() >= len - 4) {
  34. //解析剩下的部分
  35. byte[] last = new byte[len - 4];
  36. byteBuf.readBytes(last);
  37. byte[] checkSumObj = ArrayUtils.subarray(last, 2, last.length - 1);
  38. byte b = BytesUtil.sumCheck(checkSumObj);
  39. if (b == last[last.length - 1]) {
  40. //校验和正确,解析到一个正确的包
  41. ChargeMessage chargeMessage = new ChargeMessage();
  42. chargeMessage.setVersion(last[0]);
  43. chargeMessage.setSerialNo(last[1]);
  44. byte[] commandBytes = ArrayUtils.subarray(last, 2, 4);
  45. int i = BytesUtil.toIntWithLowerFirst(commandBytes);
  46. chargeMessage.setCommand(i);
  47. byte[] dataBytes = ArrayUtils.subarray(last, 4, last.length - 1);
  48. chargeMessage.setData(dataBytes);
  49. list.add(chargeMessage);
  50. } else {
  51. //包不正确,整体丢弃
  52. }
  53. } else {
  54. //读不出一个整体的包,等待数据再读
  55. byteBuf.resetReaderIndex();
  56. return;
  57. }
  58. } else {
  59. //长度字段不够读,下次再读;
  60. byteBuf.resetReaderIndex();
  61. return;
  62. }
  63. } else {
  64. //没有读到头部,继续往后读
  65. byteBuf.resetReaderIndex();
  66. byteBuf.skipBytes(1);
  67. // byteBuf.readByte();
  68. }
  69. }
  70. }
  71. }