liuf 11 месяцев назад
Родитель
Сommit
6780b3f563

+ 4 - 0
src/main/java/com/tmzn/devicelinkykc/DeviceLinkYkcApplication.java

@@ -6,16 +6,20 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
 import org.springframework.transaction.annotation.EnableTransactionManagement;
 
 import java.util.Set;
 
 @SpringBootApplication
 @EnableTransactionManagement
+@ComponentScan(basePackages = {"com.tmzn.devicelinkykc", "com.tmzn.mqtt"}) // 指定扫描的包
+
 public class DeviceLinkYkcApplication {
 
 
     public static void main(String[] args) {
+
         ConfigurableApplicationContext context= SpringApplication.run(DeviceLinkYkcApplication.class, args);
         // 注册函数,在应用程序关闭前执行
         context.registerShutdownHook();

+ 71 - 5
src/main/java/com/tmzn/devicelinkykc/controller/TestController.java

@@ -2,10 +2,11 @@ package com.tmzn.devicelinkykc.controller;
 
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
+import com.alibaba.fastjson2.JSONArray;
 import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.tmzn.devicelinkykc.constant.RedisConstant;
 import com.tmzn.devicelinkykc.entity.BillingModel;
+import com.tmzn.devicelinkykc.entity.param.AjaxResult;
 import com.tmzn.devicelinkykc.entity.param.dto.BillingModelDTO;
 import com.tmzn.devicelinkykc.mapstruct.BillingModelMapping;
 import com.tmzn.devicelinkykc.message.DeviceMsgHandle;
@@ -13,21 +14,24 @@ import com.tmzn.devicelinkykc.redis.RedisCache;
 import com.tmzn.devicelinkykc.service.BillingModelService;
 import com.tmzn.devicelinkykc.service.DeviceControlerService;
 import com.tmzn.devicelinkykc.transdata.entity.DeviceParam;
+import com.tmzn.devicelinkykc.msgparser.MessageParseMgr;
+import com.tmzn.devicelinkykc.util.Encrytion;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.data.redis.connection.Message;
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Arrays;
 import java.util.HashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * @author xp
@@ -49,6 +53,8 @@ public class TestController {
     @Autowired
     private RedisCache redisCache;
 
+    @Autowired
+    private MessageParseMgr messageParseMgr;
 
     @Autowired
     private DeviceMsgHandle deviceMsgHandle;
@@ -63,6 +69,66 @@ public class TestController {
         return "ok";
     }
 
+    @PostMapping("/parser1")
+    public String parser1(@RequestBody String message ) {
+
+        try{
+            deviceMsgHandle.deviceMsg(message);
+        }catch (Exception e){
+            e.printStackTrace();
+            System.out.println(e.getMessage());
+        }
+
+        System.out.println(111);
+
+
+        return "ok";
+    }
+
+    @GetMapping("/parser")
+    public AjaxResult parser(HttpServletRequest request ) {
+
+
+        String data = request.getParameter("data");
+
+        List<Integer> split = Arrays.stream(data.split(","))
+                .map(Integer::parseInt)  // 将 String 转换为 Integer
+                .collect(Collectors.toList());  // 收集结果到 List 中
+
+        List<List<Integer>> packages = Encrytion.parseMorePackage(split);
+
+        System.out.println(packages);
+
+        for(int i=0;i<packages.size();i++){
+            JSONObject obj = new JSONObject();
+            obj.put("data",packages.get(i));
+
+            System.out.println("parser:"+"75960_"+packages.get(i).get(1));
+            JSONObject object = messageParseMgr.parseMessage("75960_"+packages.get(i).get(1),obj);
+            System.out.println(object);
+
+            if(object!=null){
+                String m = object.toString();
+                System.out.println(m);
+            }
+
+
+
+        }
+
+        System.out.println(111);
+
+//        JSONArray objects = new JSONArray(split);
+//        JSONObject obj = new JSONObject();
+//        obj.put("data",objects);
+       // JSONObject object = messageParseMgr.parseMessage("75960_103", obj);
+
+      //  System.out.println(object);
+
+        return null;
+    }
+
+
     @GetMapping("/test")
     public String test(@RequestParam("method") String method, @RequestParam("imei") String imei) {
 

+ 1 - 1
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/HeartFrameSend.java

@@ -33,7 +33,7 @@ public class HeartFrameSend {
             return false;
         }
         deviceConnectionMsg.incrementMessageCount();
-        log.info("pileCode:"+device.getPileCode()+" -{},heart push frame over",device.getGunPort());
+        log.info("heart:"+device.getPileCode()+" -{},",device.getGunPort());
         return true;
     }
 

+ 62 - 0
src/main/java/com/tmzn/devicelinkykc/message/DeviceMsgHandle.java

@@ -19,6 +19,7 @@ import com.tmzn.devicelinkykc.frameMsg.frameType.CharngingPushFrame;
 import com.tmzn.devicelinkykc.frameMsg.frameType.LoginFrame;
 import com.tmzn.devicelinkykc.frameMsg.frameType.RealTimeStatusPushFrame;
 import com.tmzn.devicelinkykc.frameMsg.frameType.TransactionFlowPushFrame;
+import com.tmzn.devicelinkykc.msgparser.MessageParseMgr;
 import com.tmzn.devicelinkykc.openfeign.transdata.RpcResult;
 import com.tmzn.devicelinkykc.redis.RedisCache;
 import com.tmzn.devicelinkykc.service.*;
@@ -26,12 +27,14 @@ import com.tmzn.devicelinkykc.socket.DeviceConnectionMsg;
 import com.tmzn.devicelinkykc.socket.SocketHandle;
 import com.tmzn.devicelinkykc.transdata.constant.NormalChargeConstant;
 import com.tmzn.devicelinkykc.transdata.entity.DeviceParam;
+import com.tmzn.devicelinkykc.util.Encrytion;
 import org.apache.logging.log4j.util.Strings;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.stereotype.Controller;
 
 import java.io.IOException;
 import java.math.BigDecimal;
@@ -39,6 +42,7 @@ import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 
+
 /**
  * @author xp
  * @date 2024/3/13
@@ -48,6 +52,8 @@ import java.util.concurrent.TimeUnit;
 @Component
 public class DeviceMsgHandle {
 
+
+
     @Autowired
     private DeviceStatusService deviceStatusService;
     @Autowired
@@ -70,6 +76,9 @@ public class DeviceMsgHandle {
     @Autowired
     private DeviceControlerService deviceControlerService;
 
+    @Autowired
+    private MessageParseMgr messageParseMgr;
+
     @Autowired
     private BillingModelService billingModelService;
 
@@ -83,6 +92,7 @@ public class DeviceMsgHandle {
 
     public void deviceMsg(String msg) throws Exception {
         //必须过滤调非云快充设备
+
         //logger.info("redis中msg>>>" + msg);
         msg = msg.substring(1, msg.length() - 1);
         msg = msg.replace("\\", "");
@@ -109,11 +119,61 @@ public class DeviceMsgHandle {
                 return;
             }
         } catch (Exception e) {
+            e.printStackTrace();
             return;
         }
         logger.info("{},msg>>>" + msg, imei);
         //设备状态更新,true:没有type不是设备上送类型不往云快充处理 false:需要根据设备消息类型往下处理是不是需要上报云快充
+
+
+        boolean packageFlag = false;
+        try{
+            int cmd = jsonObject.getInteger("cmd");
+            if(cmd == 75960 && jsonObject.containsKey("data")){
+                JSONArray dataArray = jsonObject.getJSONArray("data");
+                List<Integer> dataListDirect = dataArray.toJavaList(Integer.class);
+                List<List<Integer>> packages = Encrytion.parseMorePackage(dataListDirect);
+                if(packages.size()>0){
+                    packageFlag = true;
+                    for(int i=0;i<packages.size();i++){
+                        try{
+                            Integer type = packages.get(i).get(1);
+                            JSONObject newObj = new JSONObject();
+                            newObj.put("imei", jsonObject.get("imei"));
+                            newObj.put("dev_id",jsonObject.get("dev_id"));
+                            newObj.put("data",packages.get(i));//重写拆
+                            newObj.put("cmd",cmd);// 包data
+                            newObj.put("type",type); //重写拆包
+                            JSONObject realData = messageParseMgr.parseMessage(cmd+"_"+type,newObj);
+                            if(realData!=null){
+                                newObj.put("real_data",realData);//重写拆包后real_data
+                            }
+                            if(packages.size()>1){
+                                logger.info("new object,{}",newObj);
+                            }
+                            handleDeviceMsg(newObj, pileCode);
+                        }catch (Exception e){
+                            e.printStackTrace();
+                            logger.warn("拆包处理异常{},{}",e.getMessage(),msg);
+                        }
+
+                    }
+                    return;
+                }
+
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            logger.error("拆包异常--{}---{}",e.getMessage(),msg);
+        }
+
+        if(packageFlag){
+//            logger.info("p0");
+            return;
+        }
+
         try {
+
             handleDeviceMsg(jsonObject, pileCode);
         } catch (Exception e) {
             logger.error("处理消息失败{},{}", imei, e.getMessage());
@@ -122,6 +182,8 @@ public class DeviceMsgHandle {
 
     }
 
+
+
     public void testMsg(String msg) throws Exception {
         logger.info("testmsg>>>" + msg);
         JSONObject jsonObject = null;

+ 92 - 0
src/main/java/com/tmzn/devicelinkykc/msgparser/MessageParseMgr.java

@@ -0,0 +1,92 @@
+package com.tmzn.devicelinkykc.msgparser;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.tmzn.mqtt.transdata.constant.NormalChargeConstant;
+import com.tmzn.devicelinkykc.msgparser.parser.CardParer;
+import com.tmzn.devicelinkykc.msgparser.parser.CommonParser;
+import com.tmzn.devicelinkykc.msgparser.parser.EndChargeNoticeParser;
+import com.tmzn.devicelinkykc.msgparser.parser.PortDetailParser;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.stereotype.Component;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 消息解析管理器
+ */
+@Component
+@Slf4j
+public class MessageParseMgr implements ApplicationRunner {
+    Map<String, MessageParser> parserMap = new HashMap<>();
+
+
+    public MessageParseMgr(){
+    }
+
+
+    public void registerParser(String cmd , MessageParser messageParser){
+        parserMap.put(cmd,messageParser);
+    }
+
+    public JSONObject parseMessage(String cmd, JSONObject object){
+        MessageParser messageParser = parserMap.get(cmd);
+        if(messageParser != null){
+            JSONObject parse = messageParser.parse(object);
+            return parse;
+        }else{
+            log.debug("no message parser found ,cmd:{}",cmd);
+        }
+
+        return null;
+
+    }
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_MAINBOARD,
+                new CommonParser(NormalChargeConstant.CONFIG_MAINBOARD_FILENAME));
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_STARTCHARGE,
+                new CommonParser(NormalChargeConstant.CONFIG_STARTCHARTGE_FILENAME));
+
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_ENDCHARGE,
+                new CommonParser(NormalChargeConstant.CONFIG_ENDCHARGE_FILENAME));
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_END_NOTICE,
+                new EndChargeNoticeParser(NormalChargeConstant.CONFIG_ENDNOTICE_FILENAME));
+
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_RESTART_DEVICE,
+                new CommonParser(NormalChargeConstant.CONFIG_RESTART_DEVICE));
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_PORT_STATUS,
+                new CommonParser(NormalChargeConstant.CONFIG_PORT_STATUS));
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_PORT_DETAIL,
+                new PortDetailParser(NormalChargeConstant.CONFIG_PORT_DETAIL_DOUBLE));
+
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_PORT_DETAIL+"_single",
+                new PortDetailParser(NormalChargeConstant.CONFIG_PORT_DETAIL_SINGLE));
+
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_PORT_REPORT,
+                new CommonParser(NormalChargeConstant.CONFIG_PORT_REPORT));
+
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.KEY_PORT_OPER,
+                new CommonParser(NormalChargeConstant.CONFIG_PORT_OPER));
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.CARD_SINGLE_OPER,
+                new CardParer());
+
+        registerParser(NormalChargeConstant.CMD_SET_MAINBOARD+"_"+NormalChargeConstant.CARD_LIST_OPER,
+                new CardParer());
+
+
+    }
+}

+ 12 - 0
src/main/java/com/tmzn/devicelinkykc/msgparser/MessageParser.java

@@ -0,0 +1,12 @@
+package com.tmzn.devicelinkykc.msgparser;
+
+
+import com.alibaba.fastjson2.JSONObject;
+import com.tmzn.mqtt.msgparser.formatter.DataFormatter;
+
+public interface MessageParser {
+
+    public JSONObject parse(JSONObject object);
+
+    public DataFormatter getDataFormatter();
+}

+ 45 - 0
src/main/java/com/tmzn/devicelinkykc/msgparser/parser/CardParer.java

@@ -0,0 +1,45 @@
+package com.tmzn.devicelinkykc.msgparser.parser;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.tmzn.mqtt.msgparser.formatter.DataFormatter;
+import com.tmzn.mqtt.transdata.util.MsgUtil;
+import com.tmzn.devicelinkykc.msgparser.MessageParser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CardParer implements MessageParser {
+    @Override
+    public JSONObject parse(JSONObject object) {
+        JSONObject realData = new JSONObject();
+        JSONArray data = object.getJSONArray("data");
+        Integer type = data.getInteger(1);
+        if(type.equals(147)){//获取所有列表
+            List<String> cardList = new ArrayList<>();
+            Integer cardNumber = data.getInteger(3);
+            for (int i = 0; i < cardNumber; i++) {
+                int start = 4*(i+1);
+                Integer cmds [] = {data.getInteger(start),data.getInteger(start+1),data.getInteger(start+2),data.getInteger(start+3)};
+                Long aLong = MsgUtil.cmdToDec(cmds);
+                cardList.add(aLong+"");
+            }
+            realData.put("list",cardList);
+            realData.put("cardNum",cardNumber);
+            return realData;
+        }else if(type.equals(145)){//85,145,5,1,120,172,246,84,5
+            Integer cardIndex = data.getInteger(3);
+            int start = 4;
+            Integer cmds [] = {data.getInteger(start),data.getInteger(start+1),data.getInteger(start+2),data.getInteger(start+3)};
+            Long aLong = MsgUtil.cmdToDec(cmds);
+            realData.put("cardNo",aLong+"");
+            realData.put("cardIndex",cardIndex);
+        }
+        return null;
+    }
+
+    @Override
+    public DataFormatter getDataFormatter() {
+        return null;
+    }
+}

+ 55 - 0
src/main/java/com/tmzn/devicelinkykc/msgparser/parser/CommonParser.java

@@ -0,0 +1,55 @@
+package com.tmzn.devicelinkykc.msgparser.parser;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.tmzn.mqtt.msgparser.formatter.DataFormatter;
+import com.tmzn.mqtt.msgparser.formatter.DataFormatterMgr;
+import com.tmzn.mqtt.transdata.constant.NormalChargeConstant;
+import com.tmzn.mqtt.transdata.util.MsgUtil;
+import com.tmzn.mqtt.transdata.util.SpringContextUtil;
+import com.tmzn.devicelinkykc.msgparser.MessageParser;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 主板通讯消息格式 解析 根据配置文件
+ */
+public  class CommonParser implements MessageParser {
+    private String fileName;
+
+    public CommonParser(String fileName){
+        this.fileName = fileName;
+    }
+
+    public static void main(String[] args) {
+    }
+
+    @Override
+    public JSONObject parse(JSONObject object) {
+        JSONObject obj = new JSONObject();
+        JSONArray data = object.getJSONArray("data");
+        DataFormatter dataFormatter = getDataFormatter();
+        List<String> keySet =dataFormatter.getKeys();
+        for (String key : keySet) {
+            Integer[] integers =dataFormatter.getNumberByKey(key);
+            List<Integer> datas = new ArrayList<>();
+            for (int i = integers[0]; i <= integers[integers.length-1]; i++) {
+                datas.add(data.getInteger(i));
+            }
+            Integer[] integers1 = datas.toArray(new Integer[datas.size()]);
+            Long aLong = MsgUtil.cmdToDec(integers1);
+            obj.put(key, aLong);
+
+        }
+
+        return obj;
+    }
+
+    @Override
+    public DataFormatter getDataFormatter() {
+        DataFormatterMgr dataFormatterMgr = SpringContextUtil.getBean(DataFormatterMgr.class);
+
+        return dataFormatterMgr.getByKey(fileName+"_"+ NormalChargeConstant.CONFIG_BACK_SUFFIX);
+    }
+}

+ 49 - 0
src/main/java/com/tmzn/devicelinkykc/msgparser/parser/EndChargeNoticeParser.java

@@ -0,0 +1,49 @@
+package com.tmzn.devicelinkykc.msgparser.parser;
+
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.tmzn.mqtt.msgparser.formatter.DataFormatter;
+import com.tmzn.mqtt.transdata.util.MsgUtil;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 由于有两种结果 需要分别处理
+ *
+ */
+public class EndChargeNoticeParser extends CommonParser {
+
+    public EndChargeNoticeParser(String fileName) {
+        super(fileName);
+    }
+
+    @Override
+    public JSONObject parse(JSONObject object) {
+        JSONObject obj = new JSONObject();
+        JSONArray data = object.getJSONArray("data");
+        if(data.size() == 11){//非线上的
+            DataFormatter dataFormatter = getDataFormatter();
+            List<String> keySet =dataFormatter.getKeys();
+            for (String key : keySet) {
+                if("card_id".equals(key)){
+                    continue;
+                }
+                Integer[] integers =dataFormatter.getNumberByKey(key);
+                List<Integer> datas = new ArrayList<>();
+                for (int i = integers[0]; i <= integers[integers.length-1]; i++) {
+                    datas.add(data.getInteger(i));
+                }
+                Integer[] integers1 = datas.toArray(new Integer[datas.size()]);
+                Long aLong = MsgUtil.cmdToDec(integers1);
+                obj.put(key, aLong);
+
+            }
+            return obj;
+        }else{
+            return super.parse(object);
+        }
+    }
+
+}

+ 109 - 0
src/main/java/com/tmzn/devicelinkykc/msgparser/parser/PortDetailParser.java

@@ -0,0 +1,109 @@
+package com.tmzn.devicelinkykc.msgparser.parser;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.alibaba.fastjson2.JSONObject;
+import com.tmzn.mqtt.msgparser.formatter.DataFormatter;
+import com.tmzn.mqtt.msgparser.formatter.DataFormatterMgr;
+import com.tmzn.mqtt.transdata.constant.NormalChargeConstant;
+import com.tmzn.mqtt.transdata.util.MsgUtil;
+import com.tmzn.mqtt.transdata.util.SpringContextUtil;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 分单枪 和双枪
+ *
+ */
+@Slf4j
+public class PortDetailParser extends CommonParser {
+
+    public PortDetailParser(String fileName) {
+        super(fileName);
+    }
+
+    public DataFormatter getSingleDataFormatter(){
+        DataFormatterMgr dataFormatterMgr = SpringContextUtil.getBean(DataFormatterMgr.class);
+        return dataFormatterMgr.getByKey(NormalChargeConstant.CONFIG_PORT_DETAIL_SINGLE+"_"+ NormalChargeConstant.CONFIG_BACK_SUFFIX);
+    }
+
+
+    @Override
+    public JSONObject parse(JSONObject object) {
+        JSONObject obj = new JSONObject();
+        JSONArray data = object.getJSONArray("data");
+        Integer integer = data.getInteger(2);
+        if(integer.equals(18)){
+            return super.parse(object);
+        }
+        if(integer.equals(9)){
+            DataFormatter dataFormatter =getSingleDataFormatter();
+            formatData(obj, data, dataFormatter,0);
+            return obj;
+        }
+        if(integer.equals(13)){
+            DataFormatter dataFormatter =getSingleDataFormatter();
+            formatData(obj, data, dataFormatter,1);
+            return obj;
+        }
+        if(integer.equals(20)){
+            DataFormatter dataFormatter = getDataFormatter();
+            formatData(obj, data, dataFormatter,2);
+            return obj;
+        }
+        if(integer.equals(11)){
+            DataFormatter dataFormatter = getSingleDataFormatter();
+            formatData(obj, data, dataFormatter,2);
+            return obj;
+        }
+        log.info("无对应的端口详情解析,"+data);
+        return obj;
+    }
+
+    private void formatData(JSONObject obj, JSONArray data, DataFormatter dataFormatter,int type) {
+        List<String> keySet = dataFormatter.getKeys();
+        for (String key : keySet) {
+            Integer[] integers = dataFormatter.getNumberByKey(key);
+            List<Integer> datas = new ArrayList<>();
+            for (int i = integers[0]; i <= integers[integers.length-1]; i++) {
+                datas.add(data.getInteger(i));
+            }
+            Integer[] integers1 = datas.toArray(new Integer[datas.size()]);
+            Long aLong = MsgUtil.cmdToDec(integers1);
+            obj.put(key, aLong);
+        }
+        if(type == 1){
+            obj.put("voltage",getVoltageValue(14,15,data));
+            obj.put("dev_temper",getValue(13,data));
+            obj.put("wire_temper",getValue(12,data));
+        }
+        if(type == 2){
+            int size = data.size();
+            obj.put("dev_temper",getValue(size-3,data));
+            obj.put("voltage",getValue(size-2,data));
+        }
+    }
+
+    private Long getVoltageValue(int i, int i1, JSONArray data) {
+        Integer value1 = data.getInteger(i);
+        Integer value2 = data.getInteger(i1)*255;
+        return new Long(value1+value2);
+    }
+
+    private Long getValue(int index,JSONArray data){
+        Integer o = data.getInteger(index);
+        Long aLong = MsgUtil.cmdToDec(new Integer[]{o});
+        return aLong;
+    }
+
+    private Long getValue(int index,int end,JSONArray data){
+        Integer arr [] = new Integer[end-index+1];
+        for (int i = index; i <=end; i++) {
+            arr[i-index] = data.getInteger(i);
+        }
+        Long aLong = MsgUtil.cmdToDec(arr);
+        return aLong;
+    }
+
+}

+ 2 - 2
src/main/java/com/tmzn/devicelinkykc/taskQueue/runner/MsgCharngingRunner.java

@@ -153,10 +153,10 @@ public class MsgCharngingRunner {
     public void try103(OrderStatus orderStatus){
         String key = "try103_charging:_"+orderStatus.getDeviceImei()+"_"+orderStatus.getGunsCode();
         if(redisCache.hasKey(key)){
-            log.info("{}-{}忽略下发充电中103", orderStatus.getPileCode(), orderStatus.getGunsCode());
+            log.info("{}-{}忽略103", orderStatus.getPileCode(), orderStatus.getGunsCode());
             return;
         }
-        log.info("{}-{}-5分钟内无状态下发一次103", orderStatus.getPileCode(), orderStatus.getGunsCode());
+        log.info("{}-{}-5分钟内无状态103", orderStatus.getPileCode(), orderStatus.getGunsCode());
         deviceControlerService.sendImeiDetail(orderStatus.getDeviceImei());
         int timeout = 60;
         //订单3分钟内一分钟请求一次103 否则就1分钟半获取一次

+ 1 - 1
src/main/java/com/tmzn/devicelinkykc/taskQueue/runner/MsgFreeRunner.java

@@ -112,7 +112,7 @@ public class MsgFreeRunner {
                     //急停中也是空闲状态上报
                     deviceStatus.setGunStatus(StatusConstant.FREE);
                 }
-                log.info("↑↑↑↑{}-{}空闲实时状态上报",deviceStatus.getPileCode(),deviceStatus.getGunPort());
+                log.info("↑↑↑↑{}-{}free",deviceStatus.getPileCode(),deviceStatus.getGunPort());
                 realTimeStatusPushFrame.deviceStatusPush(deviceConnectionMsg, FrameDataSplicing.
                         transactionNum(deviceStatus.getPileCode(), deviceConnectionMsg.getMessageCount()), deviceStatus.getPileCode(), deviceStatus.getGunPort(), deviceStatus.getGunStatus(), deviceStatus.getInsertGunStatus(), 0, 0, zero, zero, 0);
             }

+ 1 - 0
src/main/java/com/tmzn/devicelinkykc/taskQueue/runner/MsgHeartRunner.java

@@ -55,6 +55,7 @@ public class MsgHeartRunner {
             try{
                 DeviceConnectionMsg deviceConnectionMsg = map.get(devicePileCode);
                 handlePort(1,devicePileCode,deviceConnectionMsg);
+                handlePort(2,devicePileCode,deviceConnectionMsg);
             }catch (Exception e){
                 log.info("{}Heart beat task exception"+e.toString(),devicePileCode);
                 e.printStackTrace();

+ 87 - 0
src/main/java/com/tmzn/devicelinkykc/util/Encrytion.java

@@ -1,9 +1,14 @@
 package com.tmzn.devicelinkykc.util;
 
+import lombok.extern.slf4j.Slf4j;
+
 import javax.crypto.Cipher;
 import javax.crypto.spec.IvParameterSpec;
 import javax.crypto.spec.SecretKeySpec;
+import java.util.ArrayList;
+import java.util.List;
 
+@Slf4j(topic = "checksum")
 public class Encrytion {
 
     // RSA公钥
@@ -51,4 +56,86 @@ public class Encrytion {
         return decryptedBytes;
     }
 
+
+
+    public static final int PACKAGE_SOP_REQ = 0x55;
+    public static final int PACKAGE_SOP_RESP = 0xaa;
+    public static final int  CMD_LEN_POSITION  =  2;
+    public static final int  CMD_COMMAND_POS   = 1;
+
+    public static List<List<Integer>> parseMorePackage(List<Integer> data) {
+        List<List<Integer>> packages = new ArrayList<>();
+
+        // 数据长度
+        int dataLen = data.size();
+
+        while (dataLen >= 5) {
+            // 去掉前面为零的无效数据
+            while (data.size() > 0 && data.get(0) == 0) {
+                data.remove(0);  // 删除第一个元素
+            }
+
+            dataLen = data.size();
+            if (dataLen < 4) {
+                break;
+            }
+
+            // 判断是否是主板间的交互数据
+            if (data.get(0) != PACKAGE_SOP_REQ && data.get(0) != PACKAGE_SOP_RESP) {
+                break;
+            }
+
+            boolean isRequest = false;
+            if (data.get(0) == PACKAGE_SOP_REQ) {
+                isRequest = true;
+            }
+
+            // 第三位是数据长度(从第三位开始计算到倒数第一位)
+            int len = data.get(CMD_LEN_POSITION);
+
+            // 检查数据长度
+            if (len > dataLen - 3) {
+                break;
+            }
+
+            List<Integer> subData = new ArrayList<>(data.subList(0, len + 4));
+
+            int sum = checksum(subData);
+
+             Integer sumRecv = subData.get(subData.size()-1);
+            if(sum==sumRecv){
+                packages.add(subData);
+            }else{
+                log.info("data checksum error {}",subData);
+            }
+
+            if (dataLen > len + 4 + 4) {
+                data = data.subList(len + 4, dataLen);
+                dataLen = data.size();
+            } else {
+                break;
+            }
+        }
+
+
+
+
+        return packages;
+    }
+
+    public static int checksum(List<Integer> data) {
+        if (data == null || data.isEmpty()) {
+            return 0;
+        }
+
+        // 计算总和
+        int sum = 0;
+        for (int i = 1; i < data.size() - 1; i++) {
+            sum += data.get(i);
+        }
+
+        // 返回 checksum(低 8 位)
+        return sum & 0xff; // 保留低 8 位
+    }
+
 }