package com.sandu.ximon.admin.manager.iot.frame.inner.report; 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; import com.sandu.ximon.admin.manager.iot.rrpc.util.CRC32Utils; import lombok.Data; import lombok.ToString; /** * @author chenjiantian * @date 2021/12/6 18:20 * A5-82-45 * c3充电桩故障码 上报 */ @Data @ToString(callSuper = true) public class A5C3HeartbeatReportInnerFrame extends BaseResponseInnerFrame { // 目标地址 4 private String destinationAddress; // 心跳包数据 private HeartBeatDataPackage heartBeatDataPackage; @Override public A5C3HeartbeatReportInnerFrame transformFrame(String hex) { // 长度不一致时,返回null if (StrUtil.isBlank(hex)) { return null; } // MQTT通信方式(1) setConnectType(hex.substring(0, 2)); // 功能码(1) setFunctionCode(hex.substring(2, 4)); // 负荷长度(2) setPayloadLength(hex.substring(4, 8)); setDestinationAddress(hex.substring(8, 16)); String heartBeatData = hex.substring(16, hex.length() - 8); HeartBeatDataPackage heartBeatDataPackage = new HeartBeatDataPackage(); heartBeatDataPackage.transformFrame(heartBeatData); setHeartBeatDataPackage(heartBeatDataPackage); setCrc32(hex.substring(hex.length() - 8)); // 校验CRC32 String frame = hex.substring(2, hex.length() - 8); this.setValidate(CRC32Utils.validateFrame(frame, getCrc32())); return this; } @Data public static class HeartBeatDataPackage implements IResponseInnerFrame { // c3Mac(id hex) private String c3Mac; // 年 private String year; // 月 private String month; // 日 private String day; // 时 private String hour; // 分 private String min; // 秒 private String sec; // 充电桩口 private String chargingPort; // 充电桩口状态位 private String statusBit; // 设备温度 0.1℃ private String deviceTemperature; // 电网电压 0.1V private String gridVoltage; // 电网电流 0.1A private String gridCurrent; // 频率 0.01Hz private String frequency; // 功率因素 0.001 private String powerFactor; // 有功功率 0.1KW private String activePower; // 无功功率 0.1KFar private String reactivePower; // 已充电量 0.01KWh private String chargedCapacity; // 预约电量 1KWh private String reservedCapacity; // 剩余金额 0.1元 private String remainingAmount; // 已充时长 private String alreadyChargingTime; @Override public HeartBeatDataPackage transformFrame(String hex) { if (StrUtil.isBlank(hex)) { return null; } this.year = hex.substring(0, 2); this.month = hex.substring(2, 4); this.day = hex.substring(4, 6); this.hour = hex.substring(6, 8); this.min = hex.substring(8, 10); this.sec = hex.substring(10, 12); this.chargingPort = hex.substring(12, 16); this.statusBit = hex.substring(16, 18); this.deviceTemperature = hex.substring(18, 22); this.gridVoltage = hex.substring(22, 26); this.gridCurrent = hex.substring(26, 30); this.frequency = hex.substring(30, 34); this.powerFactor = hex.substring(34, 38); this.activePower = hex.substring(38, 42); this.reactivePower = hex.substring(42, 46); this.chargedCapacity = hex.substring(46, 50); this.reservedCapacity = hex.substring(50, 54); this.remainingAmount = hex.substring(54, 58); this.alreadyChargingTime = hex.substring(58, 64); return this; } } }