package com.hb.proj.gather.protocol; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.hb.proj.gather.business.DataAssembler; import com.hb.proj.gather.business.DataTransRepSingleTask; import com.hb.proj.gather.business.DataTransRepTask; import com.hb.proj.gather.business.GatherTaskExecutor; import com.hb.proj.gather.model.DiagramPO; import com.hb.proj.gather.model.SingleCombPO; import io.netty.buffer.ByteBuf; public class GatherRespParser { private final static Logger logger = LoggerFactory.getLogger(GatherRespParser.class); /** * 数据解析入口 * @param byteBuf 接收的消息 * @param startIndex 解析开始索引 * @param dataLen 数据长度字节数 * @param cmd * @param serial 设备编号 */ public static void parse(ByteBuf byteBuf ,int startIndex,int dataLen,String cmd,String serial) { ZLOpdProtCMDEnum cmdEum=ZLOpdProtCMDEnum.valueOf(cmd); if(cmdEum.getItemBytCount()==4) { Map dataMap=parseFloat(byteBuf,startIndex,dataLen,cmdEum.getParamCodes()); SingleCombPO po=DataAssembler.putPieceData(serial, dataMap); if(po!=null) { GatherTaskExecutor.execute(new DataTransRepSingleTask(po)); } } else if(cmdEum.getItemBytCount()==2) { //默认为功图数据解析 List datas=parseShort2Float(byteBuf,startIndex,dataLen); DiagramPO po=DataAssembler.putPieceData(serial,(cmdEum.getParamCodes())[0], datas); if(po!=null) { GatherTaskExecutor.execute(new DataTransRepTask(po)); } } } /** * 解析消息中的数据部分 每个数据项 4字节 * @param byteBuf * @param startIndex 数据区开始索引 * @param dataLen 数据区长度 * @param paramCodes 数据项编码 */ public static Map parseFloat(ByteBuf byteBuf ,int startIndex,int dataLen,String[] paramCodes) { byteBuf.readerIndex(startIndex); Map rtnData=new HashMap(paramCodes.length); int i=0; while(true) { rtnData.put(paramCodes[i++],byteBuf.readFloat() ); //顺序读取,readIndex 自动后移 if(i>=paramCodes.length || byteBuf.readerIndex()>=(startIndex+dataLen)) { break; } } logger.info("数据解析完:{}",rtnData); return rtnData; } /** * 解析消息中的数据部分 每个数据项 2字节 * @param byteBuf * @param startIndex * @param dataLen * @return */ public static List parseShort2Float(ByteBuf byteBuf ,int startIndex,int dataLen) { byteBuf.readerIndex(startIndex); List rtns=new ArrayList(); while(true) { rtns.add(byteBuf.readShort()+0.0f); //顺序读取,readIndex 自动后移 if(byteBuf.readerIndex()>=(startIndex+dataLen)) { break; } } logger.info("数据解析完:{}",rtns); return rtns; } /** * 专为功图点数检测解析 * @param byteBuf * @param startIndex * @param dataLen * @return */ public static short parseDiagramPoint(ByteBuf byteBuf ,int startIndex) { byteBuf.readerIndex(startIndex); return byteBuf.readShort(); } }