123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- 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<String,Float> 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<Float> 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<String,Float> parseFloat(ByteBuf byteBuf ,int startIndex,int dataLen,String[] paramCodes) {
- byteBuf.readerIndex(startIndex);
- Map<String,Float> rtnData=new HashMap<String,Float>(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<Float> parseShort2Float(ByteBuf byteBuf ,int startIndex,int dataLen) {
- byteBuf.readerIndex(startIndex);
- List<Float> rtns=new ArrayList<Float>();
- 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();
- }
- }
|