| | |
| | | package com.whyc.controller; |
| | | |
| | | import com.whyc.fbo.FboData; |
| | | import com.whyc.fbo.FboDataHeadStart; |
| | | import com.whyc.fbo.FboDataHeadStop; |
| | | import com.whyc.fbo.FboDataInf; |
| | | import com.whyc.pojo.Response; |
| | | import com.whyc.util.*; |
| | | import io.swagger.annotations.Api; |
File was renamed from src/main/java/com/whyc/util/FboData.java |
| | |
| | | package com.whyc.util; |
| | | package com.whyc.fbo; |
| | | |
| | | import com.whyc.util.ComBase; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.io.FileInputStream; |
File was renamed from src/main/java/com/whyc/util/FboDataHeadStart.java |
| | |
| | | package com.whyc.util; |
| | | package com.whyc.fbo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import com.whyc.util.ComBase; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.nio.ByteBuffer; |
File was renamed from src/main/java/com/whyc/util/FboDataHeadStop.java |
| | |
| | | package com.whyc.util; |
| | | package com.whyc.fbo; |
| | | |
| | | import com.whyc.util.ComBase; |
| | | |
| | | import java.nio.ByteBuffer; |
| | | import java.util.Arrays; |
File was renamed from src/main/java/com/whyc/util/FboDataInf.java |
| | |
| | | package com.whyc.util; |
| | | package com.whyc.fbo; |
| | | |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
New file |
| | |
| | | package com.whyc.res; |
| | | |
| | | import com.whyc.util.ComBase; |
| | | |
| | | import java.nio.ByteBuffer; |
| | | import java.nio.ByteOrder; |
| | | import java.util.Arrays; |
| | | import java.util.Date; |
| | | |
| | | |
| | | public class RESData { |
| | | public static final int MONOMER_NUM_MAX = 300; |
| | | |
| | | public static final int BYTE_LEN = 1812; |
| | | public static final int DATABYTE_LEN = 1808; |
| | | |
| | | private int[] dataType = new int[4]; //固定值0xAA 0xAA 0xAA 0xAA |
| | | |
| | | private Date data_Time; //记录时间/*Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC)*/ |
| | | |
| | | private int battSum; //固定值300 |
| | | private float[] MonomerVol = new float[MONOMER_NUM_MAX]; //单体电压,分辨率0.001V |
| | | private float[] MonomerTemp = new float[MONOMER_NUM_MAX]; //温度,偏移100,分辨率0.1℃ |
| | | private float[] MonomerRes = new float[MONOMER_NUM_MAX]; //内阻,分辨率0.001mΩ |
| | | private int CRC16; |
| | | |
| | | public boolean setData(byte[] databuf) { |
| | | ByteBuffer bf = ByteBuffer.allocate(BYTE_LEN); |
| | | bf.order(ByteOrder.LITTLE_ENDIAN); |
| | | for(int i=0;i<dataType.length;i++) { |
| | | bf.put((byte)0xAA); |
| | | } |
| | | //System.out.println(databuf.length); |
| | | bf.put(databuf); |
| | | bf.position(0); |
| | | if(databuf.length < DATABYTE_LEN) { |
| | | //System.out.println("长度错误"); |
| | | return false; |
| | | } |
| | | //System.err.println(ComFn.bytesToHexString(databuf, databuf.length)); |
| | | int crc0 = bf.getShort(BYTE_LEN-2) & 0xFFFF; |
| | | bf.position(BYTE_LEN-2); |
| | | bf.putShort(ComBase.changeIntToShort(0)); |
| | | int crc1 = RES_Crc16.CalCRC16(bf, bf.limit()); |
| | | if(crc0 != crc1) { |
| | | //System.out.println(crc0+"==="+crc1); |
| | | return false; |
| | | } |
| | | |
| | | bf.position(0); |
| | | for(int i=0;i<dataType.length;i++) { |
| | | dataType[i] = ComBase.changeByteToInt(bf.get()); //固定值0xAA 0xAA 0xAA 0xAA |
| | | } |
| | | long dateTime = bf.getInt(); |
| | | //System.out.println(dateTime); |
| | | //System.out.println(new Date().getTime()); |
| | | data_Time = new Date(dateTime*1000); //记录时间/*Returns the datetime as the number of seconds that have passed since 1970-01-01T00:00:00, Coordinated Universal Time (Qt::UTC)*/ |
| | | |
| | | //System.out.println(Com.getDateTimeFormat(data_Time, Com.DTF_YMDhms)); |
| | | |
| | | battSum = ComBase.changeShortToInt(bf.getShort()); //固定值300 |
| | | for(int i=0;i<MonomerVol.length;i++) { |
| | | MonomerVol[i] = ComBase.changeShortToFloat(bf.getShort())*0.001f; //单体电压,分辨率0.001V |
| | | } |
| | | for(int i=0;i<MonomerTemp.length;i++) { |
| | | MonomerTemp[i] = ComBase.changeShortToFloat(bf.getShort())*0.1f - 10; //温度,偏移100,分辨率0.1℃ |
| | | } |
| | | for(int i=0;i<MonomerRes.length;i++) { |
| | | MonomerRes[i] = ComBase.changeShortToFloat(bf.getShort())*0.001f; //内阻,分辨率0.001mΩ |
| | | } |
| | | return true; |
| | | } |
| | | |
| | | public static int getMonomerNumMax() { |
| | | return MONOMER_NUM_MAX; |
| | | } |
| | | public int[] getDataType() { |
| | | return dataType; |
| | | } |
| | | public Date getData_Time() { |
| | | return data_Time; |
| | | } |
| | | public int getBattSum() { |
| | | return battSum; |
| | | } |
| | | public float[] getMonomerVol() { |
| | | return MonomerVol; |
| | | } |
| | | public float[] getMonomerTemp() { |
| | | return MonomerTemp; |
| | | } |
| | | public float[] getMonomerRes() { |
| | | return MonomerRes; |
| | | } |
| | | public int getCRC16() { |
| | | return CRC16; |
| | | } |
| | | public void setDataType(int[] dataType) { |
| | | this.dataType = dataType; |
| | | } |
| | | public void setData_Time(Date data_Time) { |
| | | this.data_Time = data_Time; |
| | | } |
| | | public void setBattSum(int battSum) { |
| | | this.battSum = battSum; |
| | | } |
| | | public void setMonomerVol(float[] monomerVol) { |
| | | MonomerVol = monomerVol; |
| | | } |
| | | public void setMonomerTemp(float[] monomerTemp) { |
| | | MonomerTemp = monomerTemp; |
| | | } |
| | | public void setMonomerRes(float[] monomerRes) { |
| | | MonomerRes = monomerRes; |
| | | } |
| | | public void setCRC16(int cRC16) { |
| | | CRC16 = cRC16; |
| | | } |
| | | |
| | | @Override |
| | | public String toString() { |
| | | return "RESData [data_Time=" + data_Time + ", battSum=" + battSum + ", MonomerVol=" |
| | | + Arrays.toString(MonomerVol) + ", MonomerTemp=" + Arrays.toString(MonomerTemp) + ", MonomerRes=" |
| | | + Arrays.toString(MonomerRes) + "]"; |
| | | } |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.whyc.res; |
| | | |
| | | import com.whyc.util.ComBase; |
| | | |
| | | import java.io.FileInputStream; |
| | | import java.io.IOException; |
| | | import java.nio.ByteBuffer; |
| | | import java.nio.ByteOrder; |
| | | |
| | | |
| | | /** |
| | | * 内阻数据头 |
| | | * @author LiJun |
| | | * |
| | | */ |
| | | public class RESDataHead { |
| | | public static final int BYTE_LEN = 4; |
| | | |
| | | private int[] SYNCode = new int[2]; //固定值0xAA 0xAA |
| | | private int record_times; //记录次数,记录有多少笔RES_DATA数据 |
| | | |
| | | public boolean setHeadData(byte[] databuf) { |
| | | if(databuf.length < BYTE_LEN) { |
| | | return false; |
| | | } |
| | | ByteBuffer bf = ByteBuffer.allocate(databuf.length); |
| | | bf.order(ByteOrder.LITTLE_ENDIAN); |
| | | bf.put(databuf); |
| | | bf.position(0); |
| | | for(int i=0;i<SYNCode.length;i++) { |
| | | SYNCode[i] = ComBase.changeByteToInt(bf.get()); |
| | | } |
| | | record_times = ComBase.changeShortToInt(bf.getShort()); |
| | | //System.out.println("次数:"+record_times); |
| | | return true; |
| | | } |
| | | |
| | | public boolean checkDataHead(FileInputStream fis) |
| | | { |
| | | boolean check_ok = false; |
| | | boolean file_end = false; |
| | | byte[] tag = new byte[1]; |
| | | try { |
| | | while(true) |
| | | { |
| | | int n = 0; |
| | | for(n=0; n<4; n++) |
| | | { |
| | | if(1 != fis.read(tag, 0, 1)) |
| | | { |
| | | file_end = true; |
| | | break; |
| | | } |
| | | if((0xAA != (tag[0]&0xFF))) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | if(n >= 4) |
| | | { |
| | | check_ok = true; |
| | | break; |
| | | } |
| | | if(true == file_end) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | } catch (IOException e) { |
| | | //e.printStackTrace(); |
| | | } |
| | | return check_ok; |
| | | } |
| | | |
| | | public int[] getSYNCode() { |
| | | return SYNCode; |
| | | } |
| | | public int getRecord_times() { |
| | | return record_times; |
| | | } |
| | | public void setSYNCode(int[] sYNCode) { |
| | | this.SYNCode = sYNCode; |
| | | } |
| | | public void setRecord_times(int record_times) { |
| | | this.record_times = record_times; |
| | | } |
| | | |
| | | |
| | | |
| | | } |
New file |
| | |
| | | package com.whyc.res; |
| | | |
| | | import java.io.File; |
| | | import java.io.FileInputStream; |
| | | import java.io.IOException; |
| | | import java.util.ArrayList; |
| | | import java.util.List; |
| | | |
| | | |
| | | //FBS9600 内阻数据集 |
| | | public class RESDataInfo { |
| | | |
| | | public RESDataHead resDataHead; //内阻数据头 |
| | | public List<RESData> resDatas; //内阻数据集 |
| | | |
| | | public int parse_result = PARSE_RESULT_NULL; |
| | | |
| | | public static final int PARSE_RESULT_NULL = 0; //未知 |
| | | public static final int PARSE_RESULT_SUCCESS = 1; //解析成功 |
| | | public static final int PARSE_RESULT_NOTFOUNDFILE = 2; //文件未找到 |
| | | public static final int PARSE_RESULT_FILETYPEERR = 3; //文件格式错误 |
| | | public static final int PARSE_RESULT_FILEERROR = 4; //文件异常 |
| | | |
| | | public RESDataInfo() { |
| | | resDataHead = new RESDataHead(); //内阻数据头 |
| | | resDatas = new ArrayList<>(); //内阻数据集 |
| | | } |
| | | |
| | | public void readResFile(String filePath) |
| | | { |
| | | |
| | | FileInputStream fis = null; |
| | | try { |
| | | File f = new File(filePath); |
| | | if(!filePath.endsWith(".BRES") && !filePath.endsWith(".bres")) { |
| | | System.out.println("文件格式错误"); |
| | | parse_result = PARSE_RESULT_FILETYPEERR; |
| | | return; |
| | | } |
| | | if(!f.exists()) { |
| | | parse_result = PARSE_RESULT_NOTFOUNDFILE; |
| | | System.out.println("文件不存在.........."); |
| | | return; |
| | | } |
| | | fis = new FileInputStream(f); |
| | | byte[] buf = new byte[4]; |
| | | if(fis.read(buf, 0, buf.length) == RESDataHead.BYTE_LEN) |
| | | { |
| | | if(this.resDataHead.setHeadData(buf)) { |
| | | parse_result = PARSE_RESULT_SUCCESS; |
| | | }else { |
| | | parse_result = PARSE_RESULT_FILEERROR; |
| | | } |
| | | while(true) |
| | | { |
| | | if(resDataHead.checkDataHead(fis)) |
| | | { |
| | | byte[] databuf = new byte[RESData.DATABYTE_LEN]; |
| | | if(fis.read(databuf) == databuf.length) |
| | | { |
| | | RESData resData = new RESData(); |
| | | if(resData.setData(databuf)) { |
| | | //System.out.println(resData); |
| | | resDatas.add(resData); |
| | | } |
| | | } |
| | | } |
| | | if(fis.available() <1) { |
| | | //System.out.println("解析完成"); |
| | | break; |
| | | |
| | | } |
| | | } |
| | | }else { |
| | | parse_result = PARSE_RESULT_FILEERROR; |
| | | } |
| | | |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } finally { |
| | | if(null != fis) |
| | | { |
| | | try { |
| | | fis.close(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | |
| | | |
| | | public static void main(String[] args) { |
| | | RESDataInfo info = new RESDataInfo(); |
| | | info.readResFile("D:\\桌面文件备份\\公司各种设备资料\\FBS存储文件解析/resdata.bres"); |
| | | } |
| | | |
| | | } |
New file |
| | |
| | | package com.whyc.res; |
| | | |
| | | import java.nio.ByteBuffer; |
| | | |
| | | public class RES_Crc16 |
| | | { |
| | | private final static int CRC16Table[] = |
| | | { |
| | | 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50A5, 0x60C6, 0x70E7, |
| | | 0x8108, 0x9129, 0xA14A, 0xB16B, 0xC18C, 0xD1AD, 0xE1CE, 0xF1EF, |
| | | 0x1231, 0x0210, 0x3273, 0x2252, 0x52B5, 0x4294, 0x72F7, 0x62D6, |
| | | 0x9339, 0x8318, 0xB37B, 0xA35A, 0xD3BD, 0xC39C, 0xF3FF, 0xE3DE, |
| | | 0x2462, 0x3443, 0x0420, 0x1401, 0x64E6, 0x74C7, 0x44A4, 0x5485, |
| | | 0xA56A, 0xB54B, 0x8528, 0x9509, 0xE5EE, 0xF5CF, 0xC5AC, 0xD58D, |
| | | 0x3653, 0x2672, 0x1611, 0x0630, 0x76D7, 0x66F6, 0x5695, 0x46B4, |
| | | 0xB75B, 0xA77A, 0x9719, 0x8738, 0xF7DF, 0xE7FE, 0xD79D, 0xC7BC, |
| | | 0x48C4, 0x58E5, 0x6886, 0x78A7, 0x0840, 0x1861, 0x2802, 0x3823, |
| | | 0xC9CC, 0xD9ED, 0xE98E, 0xF9AF, 0x8948, 0x9969, 0xA90A, 0xB92B, |
| | | 0x5AF5, 0x4AD4, 0x7AB7, 0x6A96, 0x1A71, 0x0A50, 0x3A33, 0x2A12, |
| | | 0xDBFD, 0xCBDC, 0xFBBF, 0xEB9E, 0x9B79, 0x8B58, 0xBB3B, 0xAB1A, |
| | | 0x6CA6, 0x7C87, 0x4CE4, 0x5CC5, 0x2C22, 0x3C03, 0x0C60, 0x1C41, |
| | | 0xEDAE, 0xFD8F, 0xCDEC, 0xDDCD, 0xAD2A, 0xBD0B, 0x8D68, 0x9D49, |
| | | 0x7E97, 0x6EB6, 0x5ED5, 0x4EF4, 0x3E13, 0x2E32, 0x1E51, 0x0E70, |
| | | 0xFF9F, 0xEFBE, 0xDFDD, 0xCFFC, 0xBF1B, 0xAF3A, 0x9F59, 0x8F78, |
| | | 0x9188, 0x81A9, 0xB1CA, 0xA1EB, 0xD10C, 0xC12D, 0xF14E, 0xE16F, |
| | | 0x1080, 0x00A1, 0x30C2, 0x20E3, 0x5004, 0x4025, 0x7046, 0x6067, |
| | | 0x83B9, 0x9398, 0xA3FB, 0xB3DA, 0xC33D, 0xD31C, 0xE37F, 0xF35E, |
| | | 0x02B1, 0x1290, 0x22F3, 0x32D2, 0x4235, 0x5214, 0x6277, 0x7256, |
| | | 0xB5EA, 0xA5CB, 0x95A8, 0x8589, 0xF56E, 0xE54F, 0xD52C, 0xC50D, |
| | | 0x34E2, 0x24C3, 0x14A0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, |
| | | 0xA7DB, 0xB7FA, 0x8799, 0x97B8, 0xE75F, 0xF77E, 0xC71D, 0xD73C, |
| | | 0x26D3, 0x36F2, 0x0691, 0x16B0, 0x6657, 0x7676, 0x4615, 0x5634, |
| | | 0xD94C, 0xC96D, 0xF90E, 0xE92F, 0x99C8, 0x89E9, 0xB98A, 0xA9AB, |
| | | 0x5844, 0x4865, 0x7806, 0x6827, 0x18C0, 0x08E1, 0x3882, 0x28A3, |
| | | 0xCB7D, 0xDB5C, 0xEB3F, 0xFB1E, 0x8BF9, 0x9BD8, 0xABBB, 0xBB9A, |
| | | 0x4A75, 0x5A54, 0x6A37, 0x7A16, 0x0AF1, 0x1AD0, 0x2AB3, 0x3A92, |
| | | 0xFD2E, 0xED0F, 0xDD6C, 0xCD4D, 0xBDAA, 0xAD8B, 0x9DE8, 0x8DC9, |
| | | 0x7C26, 0x6C07, 0x5C64, 0x4C45, 0x3CA2, 0x2C83, 0x1CE0, 0x0CC1, |
| | | 0xEF1F, 0xFF3E, 0xCF5D, 0xDF7C, 0xAF9B, 0xBFBA, 0x8FD9, 0x9FF8, |
| | | 0x6E17, 0x7E36, 0x4E55, 0x5E74, 0x2E93, 0x3EB2, 0x0ED1, 0x1EF0 |
| | | }; |
| | | |
| | | public static int CalCRC16(final ByteBuffer buf, int count) |
| | | { |
| | | ByteBuffer tmpbuf = buf; |
| | | tmpbuf.position(0); |
| | | |
| | | int crc = 0xFFFF; |
| | | //int crc = 0x00; |
| | | int tmp; |
| | | for (int i=0; i<count; i++) |
| | | { |
| | | if(!buf.hasRemaining()) |
| | | break; |
| | | |
| | | tmp = crc; |
| | | crc = CRC16Table[(int)((((tmp&0xFFFF) >> 8) ^ (tmpbuf.get())) & 0xFF)]; |
| | | crc = crc ^ ((tmp&0xFFFF) << 8); |
| | | |
| | | //crc = CRC16Table[(int)((tmp&0xFFFF)>>8) ^ tmpbuf.get()]; |
| | | //crc = crc ^ (tmp<<8); |
| | | } |
| | | |
| | | return (crc & 0xFFFF); |
| | | } |
| | | } |
| | | /*************************************************************************************** |
| | | ****************************** end of file (FBS_Crc16) ********************************* |
| | | ***************************************************************************************/ |
New file |
| | |
| | | package com.whyc.util; |
| | | |
| | | public class ComFn { |
| | | public static String bytesToHexString(byte[] src, int len){ |
| | | StringBuilder stringBuilder = new StringBuilder(""); |
| | | if (src == null || len <= 0) { |
| | | return null; |
| | | } |
| | | for (int i = 0; i < len; i++) { |
| | | int v = src[i] & 0xFF; |
| | | String hv = Integer.toHexString(v).toUpperCase(); |
| | | if (hv.length() < 2) { |
| | | stringBuilder.append(0); |
| | | } |
| | | stringBuilder.append(hv + " "); |
| | | } |
| | | return stringBuilder.toString(); |
| | | } |
| | | } |