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 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); }