BaseAnalyzer.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package com.tokheim.aifueling.communication;
  2. import cn.hutool.core.convert.Convert;
  3. import com.tokheim.aifueling.communication.entitys.DecimalAnalysisAid;
  4. import com.tokheim.aifueling.communication.entitys.BaseInfo;
  5. import com.tokheim.aifueling.communication.entitys.NozzleDTO;
  6. import com.tokheim.aifueling.communication.toInternalInterface.InterfaceUtils;
  7. import com.tokheim.aifueling.repository.NozzleRepository;
  8. import com.tokheim.aifueling.utils.BeanUtils;
  9. import com.tokheim.aifueling.utils.ByteArrayUtils;
  10. import lombok.extern.slf4j.Slf4j;
  11. import java.util.List;
  12. @Slf4j
  13. public abstract class BaseAnalyzer {
  14. NozzleRepository nozzleRepository = BeanUtils.getBean(NozzleRepository.class);
  15. public void analyze(String ip,byte[] data) {
  16. if (data.length < 2) return;
  17. int dataType = data[0]; //数据类型
  18. BaseInfo baseInfo = getBaseInfo(ip,data); //获取基础信息
  19. BaseInfo allInfo = getOtherInfo(baseInfo, ByteArrayUtils.slipt(data,2,data.length)); //获取完整信息
  20. InterfaceUtils.sendDataToInternal(dataType,allInfo);
  21. }
  22. /**
  23. * 解析小数
  24. * @param currentIndex 当前下标
  25. * @param data 数据
  26. * @return 解析后的小数及下标应该移动到哪个位置
  27. */
  28. protected DecimalAnalysisAid getDecimal(int currentIndex, byte[] data){
  29. DecimalAnalysisAid decimalAnalysisAid = new DecimalAnalysisAid();
  30. int decimalLen = data[currentIndex+1]; //获取数据长度
  31. int decimalIntLen = data[currentIndex+2] / 2; //获取整数部分长度
  32. String decimalIntPart = Convert.toHex(ByteArrayUtils.slipt(data,currentIndex+3,currentIndex+3+decimalIntLen)); //获取整数部分
  33. String decimalDecimalsPart = Convert.toHex(ByteArrayUtils.slipt(data,currentIndex+3+decimalIntLen,currentIndex+2+decimalLen));//获取小数部分
  34. String decimal = decimalIntPart + "." + decimalDecimalsPart; //拼接金额
  35. decimalAnalysisAid.setNextIndex(currentIndex + 2 + decimalLen);
  36. decimalAnalysisAid.setDecimal(decimal);
  37. return decimalAnalysisAid;
  38. }
  39. /**
  40. * 获取基础信息
  41. * @param ip 油机 ip
  42. * @param data 原数据
  43. * @return 基础信息
  44. */
  45. private BaseInfo getBaseInfo(String ip ,byte[] data) {
  46. int fpoint = data[1] & 0x0F; //加油点
  47. BaseInfo baseInfo = new BaseInfo();
  48. baseInfo.setIp(ip);
  49. byte[] slipBytes = ByteArrayUtils.slipt(data,2,data.length);//截掉命令字和加油点
  50. int index = 0;
  51. while (index < slipBytes.length) {
  52. switch (slipBytes[index]) {
  53. case 0x21:
  54. baseInfo.setEventType((int) slipBytes[index+1]);
  55. index += 2;
  56. break;
  57. case 0x22:
  58. baseInfo.setCardType((int) slipBytes[index+1]);
  59. index += 2;
  60. break;
  61. case 0x23:
  62. int len = slipBytes[index+1];
  63. byte[] oilCodeBytes = ByteArrayUtils.slipt(slipBytes,index+2,index+2+len);
  64. String oilCode = Convert.toHex(oilCodeBytes);
  65. baseInfo.setOilCode(oilCode);
  66. index = index+2+len;
  67. break;
  68. case 0x24:
  69. int internalNum = slipBytes[index+1];//内部枪号
  70. List<NozzleDTO> nozzleByIp = nozzleRepository.findNozzleByIp(ip, fpoint, internalNum);
  71. if (!nozzleByIp.isEmpty()) {
  72. NozzleDTO nozzleDTO = nozzleByIp.get(0);
  73. baseInfo.setFuelPoint(fpoint);
  74. baseInfo.setInternalNum(internalNum);
  75. baseInfo.setNozzleNum(nozzleDTO.getPhysicalId());
  76. baseInfo.setAiId(nozzleDTO.getAiId());
  77. baseInfo.setGeLinId(nozzleDTO.getGeLinId());
  78. } else {
  79. baseInfo.setFuelPoint(fpoint);
  80. baseInfo.setInternalNum(internalNum);
  81. baseInfo.setNozzleNum(-1);
  82. baseInfo.setAiId("");
  83. baseInfo.setGeLinId("");
  84. }
  85. index += 2;
  86. break;
  87. default:
  88. index++;
  89. break;
  90. }
  91. }
  92. return baseInfo;
  93. }
  94. /**
  95. * 获取其他数据
  96. * @param baseInfo 基础信息
  97. * @param data 原数据
  98. * @return 包含其他数据的子类
  99. */
  100. protected abstract BaseInfo getOtherInfo(BaseInfo baseInfo, byte[] data);
  101. }