| | |
| | | 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.rrpc.enums.C3ErrorEnum; |
| | | import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; |
| | | import com.sandu.ximon.admin.utils.StringUtil; |
| | | import lombok.Data; |
| | | import lombok.ToString; |
| | | |
| | | /** |
| | | * @author chenjiantian |
| | | * @date 2021/12/6 14:46 |
| | | * A5-81-42 |
| | | * 单灯上报ampq 故障码 |
| | | * C3充电桩故障上报帧 |
| | | */ |
| | | @Data |
| | | @ToString(callSuper = true) |
| | |
| | | /** |
| | | * 故障码 |
| | | */ |
| | | private String errorCode; |
| | | private String errorMessage; |
| | | |
| | | @Override |
| | | public A5C3ErrorCodeReportInnerFrame transformFrame(String hex) { |
| | | //F04500080000048E0000001CA2D92F64 |
| | | if (StrUtil.isBlank(hex)) { |
| | | return null; |
| | | } |
| | |
| | | |
| | | setDestinationAddress(hex.substring(8, 16)); |
| | | |
| | | setErrorCode(hex.substring(16, hex.length() - 8)); |
| | | //故障信息 |
| | | String errorCodeHex = hex.substring(16, hex.length() - 8); |
| | | String errorInfo = errorInfo(errorCodeHex); |
| | | if (!StringUtil.strIsNullOrEmpty(errorInfo)) { |
| | | setErrorMessage(errorInfo); |
| | | } |
| | | |
| | | setCrc32(hex.substring(hex.length() - 8)); |
| | | // 校验CRC32 |
| | | String frame = getFunctionCode() + getPayloadLength() + getDestinationAddress() + getErrorCode(); |
| | | String frame = hex.substring(2,hex.length()-8); |
| | | this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); |
| | | return this; |
| | | } |
| | | |
| | | /** |
| | | * 收集故障信息 |
| | | * |
| | | * @param hexStr |
| | | * @return |
| | | */ |
| | | public String errorInfo(String hexStr) { |
| | | String errorMsg = ""; |
| | | String str = hexStr2BinStr(hexStr); |
| | | |
| | | int index = str.indexOf("1"); |
| | | while ((index = str.indexOf("1", index)) > 0) { |
| | | C3ErrorEnum[] values = C3ErrorEnum.values(); |
| | | for (C3ErrorEnum value : values) { |
| | | if (value.getCode() == index) { |
| | | errorMsg = errorMsg + value.getMessage() + ";"; |
| | | } |
| | | } |
| | | index = index + 1; |
| | | } |
| | | return errorMsg; |
| | | } |
| | | |
| | | /** |
| | | * 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; |
| | | } |
| | | } |