| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- package com.tokheim.aifueling.communication;
- import cn.hutool.core.convert.Convert;
- import com.tokheim.aifueling.communication.entitys.DecimalAnalysisAid;
- import com.tokheim.aifueling.communication.entitys.BaseInfo;
- import com.tokheim.aifueling.communication.entitys.NozzleDTO;
- import com.tokheim.aifueling.communication.toInternalInterface.InterfaceUtils;
- import com.tokheim.aifueling.repository.NozzleRepository;
- import com.tokheim.aifueling.utils.BeanUtils;
- import com.tokheim.aifueling.utils.ByteArrayUtils;
- import lombok.extern.slf4j.Slf4j;
- import java.util.List;
- @Slf4j
- public abstract class BaseAnalyzer {
- NozzleRepository nozzleRepository = BeanUtils.getBean(NozzleRepository.class);
- public void analyze(String ip,byte[] data) {
- if (data.length < 2) return;
- int dataType = data[0]; //数据类型
- BaseInfo baseInfo = getBaseInfo(ip,data); //获取基础信息
- BaseInfo allInfo = getOtherInfo(baseInfo, ByteArrayUtils.slipt(data,2,data.length)); //获取完整信息
- InterfaceUtils.sendDataToInternal(dataType,allInfo);
- }
- /**
- * 解析小数
- * @param currentIndex 当前下标
- * @param data 数据
- * @return 解析后的小数及下标应该移动到哪个位置
- */
- protected DecimalAnalysisAid getDecimal(int currentIndex, byte[] data){
- DecimalAnalysisAid decimalAnalysisAid = new DecimalAnalysisAid();
- int decimalLen = data[currentIndex+1]; //获取数据长度
- int decimalIntLen = data[currentIndex+2] / 2; //获取整数部分长度
- String decimalIntPart = Convert.toHex(ByteArrayUtils.slipt(data,currentIndex+3,currentIndex+3+decimalIntLen)); //获取整数部分
- String decimalDecimalsPart = Convert.toHex(ByteArrayUtils.slipt(data,currentIndex+3+decimalIntLen,currentIndex+2+decimalLen));//获取小数部分
- String decimal = decimalIntPart + "." + decimalDecimalsPart; //拼接金额
- decimalAnalysisAid.setNextIndex(currentIndex + 2 + decimalLen);
- decimalAnalysisAid.setDecimal(decimal);
- return decimalAnalysisAid;
- }
- /**
- * 获取基础信息
- * @param ip 油机 ip
- * @param data 原数据
- * @return 基础信息
- */
- private BaseInfo getBaseInfo(String ip ,byte[] data) {
- int fpoint = data[1] & 0x0F; //加油点
- BaseInfo baseInfo = new BaseInfo();
- baseInfo.setIp(ip);
- byte[] slipBytes = ByteArrayUtils.slipt(data,2,data.length);//截掉命令字和加油点
- int index = 0;
- while (index < slipBytes.length) {
- switch (slipBytes[index]) {
- case 0x21:
- baseInfo.setEventType((int) slipBytes[index+1]);
- index += 2;
- break;
- case 0x22:
- baseInfo.setCardType((int) slipBytes[index+1]);
- index += 2;
- break;
- case 0x23:
- int len = slipBytes[index+1];
- byte[] oilCodeBytes = ByteArrayUtils.slipt(slipBytes,index+2,index+2+len);
- String oilCode = Convert.toHex(oilCodeBytes);
- baseInfo.setOilCode(oilCode);
- index = index+2+len;
- break;
- case 0x24:
- int internalNum = slipBytes[index+1];//内部枪号
- List<NozzleDTO> nozzleByIp = nozzleRepository.findNozzleByIp(ip, fpoint, internalNum);
- if (!nozzleByIp.isEmpty()) {
- NozzleDTO nozzleDTO = nozzleByIp.get(0);
- baseInfo.setFuelPoint(fpoint);
- baseInfo.setInternalNum(internalNum);
- baseInfo.setNozzleNum(nozzleDTO.getPhysicalId());
- baseInfo.setAiId(nozzleDTO.getAiId());
- baseInfo.setGeLinId(nozzleDTO.getGeLinId());
- } else {
- baseInfo.setFuelPoint(fpoint);
- baseInfo.setInternalNum(internalNum);
- baseInfo.setNozzleNum(-1);
- baseInfo.setAiId("");
- baseInfo.setGeLinId("");
- }
- index += 2;
- break;
- default:
- index++;
- break;
- }
- }
- return baseInfo;
- }
- /**
- * 获取其他数据
- * @param baseInfo 基础信息
- * @param data 原数据
- * @return 包含其他数据的子类
- */
- protected abstract BaseInfo getOtherInfo(BaseInfo baseInfo, byte[] data);
- }
|