| | |
| | | package com.sandu.ximon.admin.manager.iot.frame.inner.report; |
| | | |
| | | import cn.hutool.core.util.HexUtil; |
| | | import cn.hutool.core.util.StrUtil; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.BaseResponseInnerFrame; |
| | | import com.sandu.ximon.admin.manager.iot.frame.inner.IResponseInnerFrame; |
| | |
| | | this.sec = parseVal(hex.substring(18, 20)); |
| | | this.chargingPort = parseVal(hex.substring(20, 24)); |
| | | this.statusBit = parseVal(hex.substring(24, 26)); |
| | | this.deviceTemperature = (parseVal(hex, 26, 28) + "." + parseVal(hex, 28, 30)); |
| | | this.gridVoltage = (parseVal(hex, 30, 32) + "." + parseVal(hex, 32, 34)); |
| | | this.gridCurrent = (parseVal(hex, 34, 36) + "." + parseVal(hex, 36, 38)); |
| | | this.frequency = (parseVal(hex, 38, 40) + "." + parseVal(hex, 40, 42)); |
| | | this.powerFactor = (parseVal(hex, 42, 44) + "." + parseVal(hex, 44, 46)); |
| | | this.activePower = (parseVal(hex, 46, 48) + "." + parseVal(hex, 48, 50)); |
| | | this.reactivePower = (parseVal(hex, 50, 52) + "." + parseVal(hex, 52, 54)); |
| | | this.chargedCapacity = (parseVal(hex, 54, 56) + "." + parseVal(hex, 56, 58)); |
| | | this.reservedCapacity = (parseVal(hex, 58, 60) + "." + parseVal(hex, 60, 62)); |
| | | this.remainingAmount = (parseVal(hex, 62, 64) + "." + parseVal(hex, 64, 66)); |
| | | this.deviceTemperature = temperatureTransition(hex.substring(26, 30)) + ""; |
| | | this.gridVoltage = (parseVal(hex, 30, 34) * 0.01) + ""; |
| | | this.gridCurrent = (parseVal(hex, 34, 38) * 0.01 + ""); |
| | | this.frequency = (parseVal(hex, 38, 42) * 0.01 + ""); |
| | | this.powerFactor = (parseVal(hex, 42, 46) * 0.01 + ""); |
| | | this.activePower = (parseVal(hex, 46, 50) * 0.01 + ""); |
| | | this.reactivePower = (parseVal(hex, 50, 54) * 0.01 + ""); |
| | | this.chargedCapacity = (parseVal(hex, 54, 58) * 0.01 + ""); |
| | | this.reservedCapacity = (parseVal(hex, 58, 62) * 0.01 + ""); |
| | | this.remainingAmount = (parseVal(hex, 62, 66) * 0.01 + ""); |
| | | this.alreadyChargingTime = parseVal(hex.substring(66, 72)); |
| | | //72-80保留,暂未使用 |
| | | |
| | | return this; |
| | | } |
| | |
| | | private String parseVal(String hex) { |
| | | return Integer.parseInt(hex, 16) + ""; |
| | | } |
| | | |
| | | /** |
| | | * 将16进制转成2进制,进行补码(反码基础上+1),得到正确数值 |
| | | * 传入16进制的温度,类型为String |
| | | * 如F500 |
| | | */ |
| | | public Double temperatureTransition(String temperature) { |
| | | |
| | | //将传进来的16进制的转为2进制 |
| | | String twoBinStr = hexStr2BinStr(temperature); |
| | | |
| | | if ("1".equals(twoBinStr.substring(0, 1))) { |
| | | //最高位是1,为负数,将16进制的进行补码,返回 |
| | | int max = 0b1111111111111111; |
| | | double result = (max - HexUtil.hexToInt(temperature)) * (-0.01); |
| | | return result; |
| | | |
| | | } else if ("0".equals(twoBinStr.substring(0, 1))) { |
| | | //最高位是0,正数,直接返回 |
| | | double result = (HexUtil.hexToInt(temperature)) * (0.01); |
| | | return result; |
| | | |
| | | } |
| | | // |
| | | return 0.00; |
| | | } |
| | | |
| | | /** |
| | | * 16进制字符串转为二进制 |
| | | */ |
| | | public String hexStr2BinStr(String hexStr) { |
| | | if (hexStr == null || hexStr.length() % 2 != 0) { |
| | | return null; |
| | | } |
| | | String bString = "", tmp; |
| | | for (int i = 0; i < hexStr.length(); i++) { |
| | | tmp = "0000" + Integer.toBinaryString(Integer.parseInt(hexStr.substring(i, i + 1), 16)); |
| | | bString += tmp.substring(tmp.length() - 4); |
| | | } |
| | | return bString; |
| | | } |
| | | } |
| | | } |