Browse Source

Merge branch 'master' of http://git.fast-fun.cn:92/ruili/zk-station-server

jek 2 years ago
parent
commit
2777424b44

+ 86 - 13
src/main/java/com/zhili/zkstationserver/dto/ChargerState.java

@@ -1,10 +1,17 @@
 package com.zhili.zkstationserver.dto;
 
+import com.zhili.zkstationserver.entity.BmsAlarmDict;
+import com.zhili.zkstationserver.init.DataInit;
 import com.zhili.zkstationserver.util.BytesUtil;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 import org.apache.commons.lang.ArrayUtils;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 /**
  * @author :HuangBin
  * @description:TODO
@@ -21,14 +28,16 @@ public class ChargerState {
     String chargerCode;
     //枪号
     Integer gunNo;
+    // 序列号
+    String serialNo;
     //需求电压
-    Float demandVoltage;
+    Integer demandVoltage;
     //需求电流
-    Float demandCurrent;
+    Integer demandCurrent;
     //直流充电电压
-    Float chargeVoltage;
+    Integer chargeVoltage;
     //直流充电电流
-    Float chargeCurrent;
+    Integer chargeCurrent;
     //充电机状态
     Integer chargerState;
     //本次累积充电电量
@@ -40,12 +49,12 @@ public class ChargerState {
     //电池sn
     String sn;
     //电池soc
-    Integer soc;
+    Float soc;
     //电池soh
-    Integer soh;
+    Float soh;
     //电池包总电流
     Float current;
-    //电池包总电
+    //电池端高
     Float innerV;
     //电芯温度最大值
     Integer maxCellTemp;
@@ -79,13 +88,77 @@ public class ChargerState {
     Boolean connected;
     //额定总容量
     Float ratedEnergy;
+    // 充电机告警信息
+    Map<String,Integer> chargerAlarmMap = new HashMap<>();
+    // bms告警位信息
+    Map<String,Integer> bmsAlarmMap = new HashMap<>();
+    // 时间
+    String time;
+
+    public ChargerState(String stationCode, byte[] data) {
 
-    public ChargerState(String stationCode, byte[] data){
         this.stationCode = stationCode;
-        this.chargerId = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,0,1));
-        this.chargerCode = BytesUtil.parseString(ArrayUtils.subarray(data, 1,33));
-        this.gunNo = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,33,1));
-        this.chargerState = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 42,43));
-        this.soc = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 80,81));
+        this.chargerId = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 0, 1));
+        this.chargerCode = BytesUtil.parseString(ArrayUtils.subarray(data, 1, 33));
+        this.gunNo = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 33, 34));
+        this.serialNo = BytesUtil.parseString(ArrayUtils.subarray(data, 34, 66));
+        this.demandVoltage = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 66, 68));
+        this.demandCurrent = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 68, 70));
+        this.chargeVoltage = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 70, 72));
+        this.chargeCurrent = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 72, 74));
+        this.chargerState = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 74, 75));
+        this.curAccCapacity = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 75, 4)) * 0.1f;
+        this.chargerComm = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 79, 80));
+        this.estimateTime = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 80, 84));
+        this.sn = BytesUtil.parseString(ArrayUtils.subarray(data, 84, 111));
+        this.soc = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 111, 112)) * 0.4f;
+        this.soh = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 112, 113)) * 0.4f;
+        this.current = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 113, 115)) * 0.1f - 1000;
+        this.innerV = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 115, 117)) * 0.1f;
+        this.maxCellTemp = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 117, 118)) - 50;
+        this.minCellTemp = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 118, 119)) - 50;
+        this.avgCellTemp = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,119,120)) - 50;
+        this.maxTCSC = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,120,121));
+        this.minTCSC = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,121,122));
+        this.maxTCSCProbe = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,122,123));
+        this.minTCSCProbe = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,123,124));
+        this.maxCellVoltage = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,124,126)) * 0.001f;
+        this.maxVCSC = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,126,127));
+        this.maxVSingle = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,127,128));
+        this.avgCellVoltage = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,128,130)) * 0.001f;
+        this.minCellVoltage = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 130,132)) * 0.001f;
+        this.minVCSC = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 132,133));
+        this.minVSingle = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,133,134));
+        this.connected = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data, 134, 135)) == 1;
+        this.ratedEnergy = BytesUtil.toIntWithLowerFirst(ArrayUtils.subarray(data,135,137)) * 0.1f;
+        // 充电机告警位信息
+        Map<Integer, String> alarmMsgMap = DataInit.getChargerAlarmMap();
+        List<Integer> faultList = BytesUtil.getFault(ArrayUtils.subarray(data, 137, 169));
+        for (Integer k : alarmMsgMap.keySet()) {
+            this.chargerAlarmMap.put(k.toString(),faultList.contains(k) ? 1 : 0);
+        }
+        // bms告警位信息
+        Map<String, List<BmsAlarmDict>> bmsAlarmMsgMap = DataInit.getBmsAlarmMsgMap();
+        byte[] bmsAlarm1 = ArrayUtils.subarray(data, 169, 177);
+        List<BmsAlarmDict> bmsAlarmMsgList1 = bmsAlarmMsgMap.get("0x1880D0F3");
+        for (BmsAlarmDict bmsAlarmDict : bmsAlarmMsgList1) {
+            Integer byteSeq = bmsAlarmDict.getByteSeq();
+            byte frameMsgByte = bmsAlarm1[byteSeq];
+            Integer startBit = bmsAlarmDict.getStartBit();
+            Integer endBit = bmsAlarmDict.getEndBit();
+            int bits = BytesUtil.parseBits(frameMsgByte, startBit, endBit);
+            this.bmsAlarmMap.put(String.valueOf(bmsAlarmDict.getAlarmCode()), bits);
+        }
+        byte[] bmsAlarm2 = ArrayUtils.subarray(data, 177, 184);
+        List<BmsAlarmDict> bmsAlarmMsgList2 = bmsAlarmMsgMap.get("0x1881D0F3");
+        for (BmsAlarmDict bmsAlarmDict : bmsAlarmMsgList2) {
+            Integer byteSeq = bmsAlarmDict.getByteSeq();
+            byte frameMsgByte = bmsAlarm2[byteSeq - 1];
+            Integer startBit = bmsAlarmDict.getStartBit();
+            Integer endBit = bmsAlarmDict.getEndBit();
+            int bits = BytesUtil.parseBits(frameMsgByte, startBit, endBit);
+            this.bmsAlarmMap.put(String.valueOf(bmsAlarmDict.getAlarmCode()), bits);
+        }
+        this.time = BytesUtil.composeTimeString(ArrayUtils.subarray(data, 184, 192));
     }
 }

+ 1 - 0
src/main/java/com/zhili/zkstationserver/dto/StationMessage.java

@@ -14,6 +14,7 @@ public class StationMessage {
 
     public static class CommandType{
         public static final int CHARGER_STATE = 103;
+        public static final int CHARGER_STATE_REPLY = 104;
         public static final int EXCHANGE_EVENT = 201;
         public static final int EXCHANGE_EVENT_REPLY = 202;
         public static final int REPLY_EXCHANGE = 301;

+ 68 - 0
src/main/java/com/zhili/zkstationserver/entity/BmsAlarmDict.java

@@ -0,0 +1,68 @@
+package com.zhili.zkstationserver.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import lombok.Data;
+
+/**
+ * @author zhaoyuanqi
+ */
+@Data
+@TableName("bms_alarm_dict")
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class BmsAlarmDict {
+
+    @TableId(value = "id",type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 告警编号
+     */
+    private Integer alarmCode;
+    /**
+     * 帧id
+     */
+    private String frameId;
+
+    /**
+     * 字节顺序
+     */
+    private Integer byteSeq;
+
+    /**
+     * 告警顺序
+     */
+    private Integer seq;
+
+    /**
+     * 告警开始位
+     */
+    private Integer startBit;
+
+    /**
+     * 告警结束位
+     */
+    private Integer endBit;
+
+    /**
+     * 告警名称
+     */
+    private String alarmName;
+
+    /**
+     * 告警标识 1:告警 2:状态 3:未定义
+     */
+    private Integer alarmType;
+
+    /**
+     * 告警值
+     */
+    private String alarmValue;
+
+    public String getAlarmId() {
+
+        return "alarm_" + this.alarmCode;
+    }
+}

+ 32 - 0
src/main/java/com/zhili/zkstationserver/entity/ChargerAlarmDict.java

@@ -0,0 +1,32 @@
+package com.zhili.zkstationserver.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @author zhaoyuanqi
+ */
+@Data
+@TableName("charger_alarm_dict")
+public class ChargerAlarmDict {
+
+    @TableId(type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 告警编码
+     */
+    private Integer alarmCode;
+
+    /**
+     * 告警信息
+     */
+    private String alarmName;
+
+    public String getAlarmId() {
+
+        return "alarm_" + this.alarmCode;
+    }
+}

+ 21 - 2
src/main/java/com/zhili/zkstationserver/handler/StationMessageHandler.java

@@ -93,7 +93,7 @@ public class StationMessageHandler extends ChannelInboundHandlerAdapter {
                 replyBytes = new byte[9];
                 BytesUtil.setSubBytes(replyBytes, 0, stationCodeBytes);
                 log.info("sign in result:{}", registerSuccess);
-                if (registerSuccess.equals(0l)) {
+                if (registerSuccess.equals(0L)) {
                     replyBytes[8] = (byte) 0;
                     stationMessageReply.setData(replyBytes);
                     ctx.channel().writeAndFlush(stationMessageReply);
@@ -120,7 +120,10 @@ public class StationMessageHandler extends ChannelInboundHandlerAdapter {
                 registerSuccess = (Long) redisTemplate.execute(stationRegisterScript, stationRegisterkeys, stationConnInfo, 15);
 //                stationMessageReply = new StationMessage();
                 if (registerSuccess.equals(0l)) {
-                    //成功
+                    //回复成功
+                    stationMessageReply = new StationMessage();
+                    stationMessageReply.setCommand(404);
+                    stationMessageReply.setData(new byte[1]);
                 } else {
                     //注册失败,有可能已经有站注册了,一个站只能有一个连接,关闭
                     log.info("心跳失败,stationCode:{}", stationCode);
@@ -148,6 +151,22 @@ public class StationMessageHandler extends ChannelInboundHandlerAdapter {
                 }
                 ChargerState chargerState = new ChargerState(stationCode, data);
                 log.info("chargerState:" + chargerState);
+                topic = serverConfig.getServiceCenterName() + "_ChargerState";
+                log.info("send to {}", topic);
+                kafkaTemplate.send(topic, JSON.toJSONString(chargerState));
+                byte[] chargerIdBytes = ArrayUtils.subarray(data, 0, 1);
+                byte[] chargerCodeBytes = ArrayUtils.subarray(data, 1, 33);
+                byte[] gunNoBytes = ArrayUtils.subarray(data, 33, 34);
+                byte[] timeBytes = ArrayUtils.subarray(data, 184, 192);
+                stationMessageReply = new StationMessage();
+                stationMessageReply.setCommand(CommandType.CHARGER_STATE_REPLY);
+                replyBytes = new byte[43];
+                BytesUtil.setSubBytes(replyBytes,0,chargerIdBytes);
+                BytesUtil.setSubBytes(replyBytes,1,chargerCodeBytes);
+                BytesUtil.setSubBytes(replyBytes,33,gunNoBytes);
+                BytesUtil.setSubBytes(replyBytes,34,timeBytes);
+                replyBytes[42] = (byte) 0;
+                ctx.writeAndFlush(replyBytes);
                 break;
             case CommandType.REPLY_EXCHANGE:
                 stationCode = (String) Optional.ofNullable(ctx.channel().attr(AttributeKey.valueOf("station")).get()).orElse("");

+ 73 - 0
src/main/java/com/zhili/zkstationserver/init/DataInit.java

@@ -0,0 +1,73 @@
+package com.zhili.zkstationserver.init;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zhili.zkstationserver.entity.BmsAlarmDict;
+import com.zhili.zkstationserver.entity.ChargerAlarmDict;
+import com.zhili.zkstationserver.mapper.BmsAlarmDictMapper;
+import com.zhili.zkstationserver.mapper.ChargerAlarmDictMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhaoyuanqi
+ */
+@Component
+public class DataInit {
+
+    @Autowired
+    private ChargerAlarmDictMapper chargerAlarmDictMapper;
+    @Autowired
+    private BmsAlarmDictMapper bmsAlarmDictMapper;
+
+    /**
+     * 静态map对象
+     */
+    private static Map<Integer, String> alarmMsgMap = new HashMap<>();
+    private static Map<String, List<BmsAlarmDict>> bmsAlarmMsgMap = new HashMap<>();
+    private static Map<Integer, List<Integer>> bmsAlarmValueMap = new HashMap<>();
+    private static Map<Integer, String> bmsAlarmNameMap = new HashMap<>();
+
+    @PostConstruct
+    public void init() {
+        initMap();
+    }
+
+    public void initMap() {
+        List<ChargerAlarmDict> alarmRecordMsgList = chargerAlarmDictMapper.selectList(new LambdaQueryWrapper<ChargerAlarmDict>()
+                .orderByAsc(ChargerAlarmDict::getAlarmCode));
+        for (ChargerAlarmDict alarmRecordMsg : alarmRecordMsgList) {
+            alarmMsgMap.put(alarmRecordMsg.getAlarmCode(), alarmRecordMsg.getAlarmName());
+        }
+
+        List<String> frameIds = bmsAlarmDictMapper.getFrameIds();
+        for (String frameId : frameIds) {
+            List<BmsAlarmDict> bmsAlarmDictList = bmsAlarmDictMapper.listMap(frameId);
+            bmsAlarmMsgMap.put(frameId, bmsAlarmDictList);
+        }
+
+        List<BmsAlarmDict> alarmValues = bmsAlarmDictMapper.getAlarmValues();
+        for (BmsAlarmDict alarmValue : alarmValues) {
+            String[] split = alarmValue.getAlarmValue().split(",");
+            ArrayList<Integer> arrayList = new ArrayList<>();
+            for (String s : split) {
+                arrayList.add(Integer.valueOf(s));
+            }
+            bmsAlarmValueMap.put(alarmValue.getAlarmCode(), arrayList);
+            bmsAlarmNameMap.put(alarmValue.getAlarmCode(), alarmValue.getAlarmName());
+        }
+    }
+
+    public static Map<Integer, String> getChargerAlarmMap() {
+        return alarmMsgMap;
+    }
+
+    public static Map<String, List<BmsAlarmDict>> getBmsAlarmMsgMap() {
+        return bmsAlarmMsgMap;
+    }
+}

+ 19 - 0
src/main/java/com/zhili/zkstationserver/mapper/BmsAlarmDictMapper.java

@@ -0,0 +1,19 @@
+package com.zhili.zkstationserver.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhili.zkstationserver.entity.BmsAlarmDict;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+@Mapper
+public interface BmsAlarmDictMapper extends BaseMapper<BmsAlarmDict> {
+
+    List<BmsAlarmDict> listMap(@Param("frameId") String frameId);
+
+    List<String> getFrameIds();
+
+    List<BmsAlarmDict> getAlarmValues();
+}

+ 12 - 0
src/main/java/com/zhili/zkstationserver/mapper/ChargerAlarmDictMapper.java

@@ -0,0 +1,12 @@
+package com.zhili.zkstationserver.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.zhili.zkstationserver.entity.ChargerAlarmDict;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * @author zhaoyuanqi
+ */
+@Mapper
+public interface ChargerAlarmDictMapper extends BaseMapper<ChargerAlarmDict> {
+}

+ 1 - 1
src/main/resources/application-dev.yml

@@ -37,7 +37,7 @@ logging:
 
 mybatis-plus:
   mapper-locations: mapper/*.xml
-  typeAliasesPackage: com.zhili.stationcontrol.entrty
+  typeAliasesPackage: com.zhili.zkstationserver.entrty
   global-config:
     banner: false
   configuration:

+ 14 - 0
src/main/resources/mapper/BmsAlarmDictMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhili.zkstationserver.mapper.BmsAlarmDictMapper">
+
+    <select id="listMap" resultType="com.zhili.zkstationserver.entity.BmsAlarmDict">
+        select * from bms_alarm_dict where frame_id = #{frameId}
+    </select>
+    <select id="getFrameIds" resultType="java.lang.String">
+        select distinct frame_id from bms_alarm_dict
+    </select>
+    <select id="getAlarmValues" resultType="com.zhili.zkstationserver.entity.BmsAlarmDict">
+        SELECT alarm_code,alarm_value,alarm_name FROM `bms_alarm_dict` where alarm_type = 1
+    </select>
+</mapper>

+ 5 - 0
src/main/resources/mapper/ChargerAlarmDictMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zhili.zkstationserver.mapper.ChargerAlarmDictMapper">
+
+</mapper>