liuf 8 miesięcy temu
rodzic
commit
5f242fe4ed

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

@@ -319,12 +319,12 @@ public class TestController {
     @Autowired LoginFrame loginFrame;
 
     @GetMapping("/test3")
-    public String test3() throws Exception {
+    public String test3(@RequestParam("pileCode") String pileCode) throws Exception {
         //调用重启
 
 
 
-        loginFrame.test();
+        loginFrame.test(pileCode);
         return "ok";
     }
 

+ 2 - 2
src/main/java/com/tmzn/devicelinkykc/frameMsg/FrameDataSplicing.java

@@ -64,8 +64,8 @@ public class FrameDataSplicing {
         if(is18){
              crc = modbusCRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
         }else{
-            crc = YunCrcUtil.calculateCrc( Arrays.copyOfRange(outBuf, 2, index));
-             //crc = modbus16CRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
+//            crc = YunCrcUtil.calculateCrc( Arrays.copyOfRange(outBuf, 2, index));
+             crc = modbus16CRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
 //            int c1  = modbus16CRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
 //
 //            int c2 = modbusCRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);

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

@@ -1,55 +1,55 @@
-package com.tmzn.devicelinkykc.frameMsg.frameType;
-
-import com.tmzn.devicelinkykc.constant.ykc.StatusConstant;
-import com.tmzn.devicelinkykc.entity.DeviceStatus;
-import com.tmzn.devicelinkykc.frameMsg.DataConversion;
-import com.tmzn.devicelinkykc.frameMsg.FrameDataSplicing;
-import com.tmzn.devicelinkykc.msgEnum.DeviceSendYkc;
-import com.tmzn.devicelinkykc.socket.DeviceConnectionMsg;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.io.IOException;
-
-/**
- * @author xp
- * @date 2024/3/14
- * @explain " 充电桩心跳包 不加密"
- */
-@Component
-@Slf4j(topic = "HeartFrameSend")
-public class HeartFrameSend {
-
-    public boolean heartSend(DeviceConnectionMsg deviceConnectionMsg, DeviceStatus device){
-        byte[] send = heartSend(device.getPileCode(), device.getGunPort(), device.getGunStatus()==StatusConstant.FAULT?StatusConstant.HEART_GUNS_STATUS_FAULT:StatusConstant.HEART_GUNS_STATUS_OK);
-        //log.info("heartSend>设备心跳消息上送>>>"+DataConversion.bytesToHexString(send));
-        byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.HEART_SEND.getFrameType(), DeviceSendYkc.HEART_SEND.getEncryptFlag(), send, send.length, deviceConnectionMsg.getIs18());
-        try {
-            deviceConnectionMsg.getOutputStream().write(bytes);
-            deviceConnectionMsg.getOutputStream().flush();
-        } catch (IOException e) {
-            log.info("pileCode:"+device.getPileCode()+" ,heart push frame Exception");
-            e.printStackTrace();
-            return false;
-        }
-        deviceConnectionMsg.incrementMessageCount();
-        log.info("heart:"+device.getPileCode()+" -{},",device.getGunPort());
-        return true;
-    }
-
-    private   byte[] heartSend(String deviceId , int guns, byte port) {
-        byte[] msg = new byte[9];//消息体
-
-        //1.枪编码
-        byte[] pile_code = new byte[7];
-        pile_code= DataConversion.bcdToBytes(deviceId, pile_code.length);
-        System.arraycopy(pile_code, 0, msg, 0, pile_code.length);
-        //2.枪号
-        msg[7] = (byte) guns;
-        // 3.充电枪状态
-        msg[8] = port;
-        return msg;
-    }
-
-
-}
+package com.tmzn.devicelinkykc.frameMsg.frameType;
+
+import com.tmzn.devicelinkykc.constant.ykc.StatusConstant;
+import com.tmzn.devicelinkykc.entity.DeviceStatus;
+import com.tmzn.devicelinkykc.frameMsg.DataConversion;
+import com.tmzn.devicelinkykc.frameMsg.FrameDataSplicing;
+import com.tmzn.devicelinkykc.msgEnum.DeviceSendYkc;
+import com.tmzn.devicelinkykc.socket.DeviceConnectionMsg;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+
+/**
+ * @author xp
+ * @date 2024/3/14
+ * @explain " 充电桩心跳包 不加密"
+ */
+@Component
+@Slf4j(topic = "HeartFrameSend")
+public class HeartFrameSend {
+
+    public boolean heartSend(DeviceConnectionMsg deviceConnectionMsg, DeviceStatus device){
+        byte[] send = heartSend(device.getPileCode(), device.getGunPort(), device.getGunStatus()==StatusConstant.FAULT?StatusConstant.HEART_GUNS_STATUS_FAULT:StatusConstant.HEART_GUNS_STATUS_OK);
+        //log.info("heartSend>设备心跳消息上送>>>"+DataConversion.bytesToHexString(send));
+        byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.HEART_SEND.getFrameType(), DeviceSendYkc.HEART_SEND.getEncryptFlag(), send, send.length, deviceConnectionMsg.getIs18());
+        try {
+            deviceConnectionMsg.getOutputStream().write(bytes);
+            deviceConnectionMsg.getOutputStream().flush();
+        } catch (IOException e) {
+            log.info("pileCode:"+device.getPileCode()+" ,heart push frame Exception");
+            e.printStackTrace();
+            return false;
+        }
+        deviceConnectionMsg.incrementMessageCount();
+      //  log.info("heart:"+device.getPileCode()+" -{},",device.getGunPort());
+        return true;
+    }
+
+    private   byte[] heartSend(String deviceId , int guns, byte port) {
+        byte[] msg = new byte[9];//消息体
+
+        //1.枪编码
+        byte[] pile_code = new byte[7];
+        pile_code= DataConversion.bcdToBytes(deviceId, pile_code.length);
+        System.arraycopy(pile_code, 0, msg, 0, pile_code.length);
+        //2.枪号
+        msg[7] = (byte) guns;
+        // 3.充电枪状态
+        msg[8] = port;
+        return msg;
+    }
+
+
+}

+ 24 - 6
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/LoginFrame.java

@@ -60,8 +60,10 @@ public class LoginFrame {
             e.printStackTrace();
         }
         if (send.length>0) {
-            log.info("{}>设备登录消息上送>>>"+DataConversion.bytesToHexString(send),device.getPileCode());
+
             byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.LOGIN.getFrameType(), DeviceSendYkc.LOGIN.getEncryptFlag(), send, send.length, deviceConnectionMsg.getIs18());
+
+            log.info("{}>设备登录消息上送>>>"+DataConversion.bytesToHexString(bytes),device.getPileCode());
             try {
                 deviceConnectionMsg.getOutputStream().write(bytes);
                 deviceConnectionMsg.getOutputStream().flush();
@@ -79,10 +81,12 @@ public class LoginFrame {
         log.info("pileCode:"+device.getPileCode()+" login over");
     }
 
-    public void test() throws Exception {
+    public void test(String pileCode) throws Exception {
         Device device = new Device();
-        device.setPileCode("21010525042910");
-        device.setCommProtocolVer("1.5");
+        device.setPileCode(pileCode);
+//        device.setPileCode("00000000000033");
+//        device.setPileCode("21010525042901");
+        device.setCommProtocolVer("1.6");
         device.setProgramVersion("1.0");
         device.setSimCard("0");
         device.setChargerGunNum((byte) 1);
@@ -93,10 +97,24 @@ public class LoginFrame {
 
         byte[]   send = loginMsgNot18(device);
         log.info("{}>设备登录消息上送>>>"+DataConversion.bytesToHexString(send),device.getPileCode());
-        byte[] bytes = FrameDataSplicing.spliceing(1, DeviceSendYkc.LOGIN.getFrameType(), DeviceSendYkc.LOGIN.getEncryptFlag(), send, send.length, false);
-
+        byte[] bytes = FrameDataSplicing.spliceing(0, DeviceSendYkc.LOGIN.getFrameType(), DeviceSendYkc.LOGIN.getEncryptFlag(), send, send.length, false);
         System.out.println(bytes);
 
+//        device.setPileCode("21010525042916");
+////        device.setPileCode("21010525042901");
+//        device.setCommProtocolVer("1.5");
+//        device.setProgramVersion("1.0");
+//        device.setSimCard("0");
+//        device.setChargerGunNum((byte) 1);
+//        device.setPileType((byte) 0);
+//        device.setNetLinkType((byte) 3);
+//        device.setOperators((byte) 4);
+//           send = loginMsgNot18(device);
+//        log.info("{}>设备登录消息上送>>>"+DataConversion.bytesToHexString(send),device.getPileCode());
+//        bytes = FrameDataSplicing.spliceing(1, DeviceSendYkc.LOGIN.getFrameType(), DeviceSendYkc.LOGIN.getEncryptFlag(), send, send.length, false);
+//
+//        System.out.println(bytes);
+
     }
 
     private byte[] loginMsgNot18( Device device) throws Exception {

+ 64 - 34
src/main/java/com/tmzn/devicelinkykc/message/DeviceMsgHandle.java

@@ -429,49 +429,73 @@ public class DeviceMsgHandle {
         JSONArray data = jsonObject.getJSONArray("data");
         int port = data.getInteger(2);
         int status = data.getInteger(3);
-        //关闭急停和急停完,停止充电,获取设备状态
-        DeviceParam dataParam = new DeviceParam();
-        dataParam.setDeviceId(imei);
-        dataParam.setCcid(imei);
-        deviceControlerService.sendPortDetailCmd(dataParam);
 
-        logger.info(imei+ ":急停停充>>>上报交易记录>>>");
-        deviceControlerService.stopCharge(imei, imei, port);
-        //查询计费模板
-        QueryWrapper<BillingModel> billingModelQueryWrapper = new QueryWrapper<>();
-        billingModelQueryWrapper.eq("device_imei", imei);
-        BillingModel model = billingModelService.getOne(billingModelQueryWrapper);
+        //关闭急停不处理
+        if(status==0){
+            logger.info("关闭急停不处理{}", imei);
+            return;
+        }
+
         QueryWrapper<OrderStatus> orderStatusQueryWrapper = new QueryWrapper<>();
         orderStatusQueryWrapper.eq("device_imei", imei)
                 .eq("guns_code", port)
                 .orderByDesc("create_time"
                 ).last("limit 1");
         OrderStatus statusServiceOne = orderStatusService.getOne(orderStatusQueryWrapper);
-        statusServiceOne.setEndTime(System.currentTimeMillis());
-        DeviceConnectionMsg deviceConnection = socketHandle.getDeviceConnection(statusServiceOne.getPileCode());
-        if (status == 1) {
-            logger.info(statusServiceOne.getPileCode() + ":急停停充>>>上报交易记录>>>");
-            byte[] encrypt = new byte[0];
-            if (port == 1) {
-                //急停停充:急停状态下:1.向设备发起结束充电,结算交易订单(交给结束充电处理;但是要考虑是急停的原因),2.上报的充电结束的订单式
+        if (statusServiceOne == null) {
+            logger.info("没有急停待处理订单{}", imei);
+            deviceControlerService.sendImeiDetail(imei);
+            return;
+        }
+
+        if (statusServiceOne.getTransactionOrderReplyStatus() == StatusConstant.TRANSACTION_ORDER_REPLY_STATUS_SUCC) {
+            logger.info("订单状态已上报成功{},id:{}", imei, statusServiceOne.getId());
+            deviceControlerService.sendImeiDetail(imei);
+            return;
+        }
 
-                Map<String, BigDecimal> map = transMoney.compute(1, model, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime());
+        statusServiceOne.setReasonStopCharging(TransConstant.EMERGENCY_STOP_EXCEPTION_STOP);
+        orderStatusService.updateById(statusServiceOne);
 
-                encrypt = transactionFlowPushFrame.sendTrans(deviceConnection, statusServiceOne.getTransOrder(), statusServiceOne.getPileCode(), (byte) 1, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime(), model, statusServiceOne.getCard(), map, TransConstant.EMERGENCY_STOP_EXCEPTION_STOP);
-            } else if (port == 2) {
-                //TODO:这里还是模拟数据上报
+        logger.info(imei+ ":急停停充关闭充电>>>");
+        deviceControlerService.stopCharge(imei, imei, port);
 
-                Map<String, BigDecimal> map = transMoney.compute(2, model, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime());
-                //模拟3.5千瓦
-                encrypt = transactionFlowPushFrame.sendTrans(deviceConnection, statusServiceOne.getTransOrder(), statusServiceOne.getPileCode(), (byte) 2, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime(), model, statusServiceOne.getCard(), map, TransConstant.EMERGENCY_STOP_EXCEPTION_STOP);
-            }
-            statusServiceOne.setOriginalText(encrypt);
-            statusServiceOne.setReasonStopCharging(TransConstant.EMERGENCY_STOP_EXCEPTION_STOP);
-            statusServiceOne.setStopChargingReply(StatusConstant.STOP_CHARGING_REPLY_OK);
-            statusServiceOne.setNowOrderStatus(StatusConstant.NOW_ORDER_STATUS_CHARGING_ENDING);
-            statusServiceOne.setTransactionOrderReportingActionStatus(StatusConstant.TRANSACTION_ORDER_REPORTING_ACTION_STATUS_OK);
-            orderStatusService.updateById(statusServiceOne);
-        }
+//        //查询计费模板
+//        QueryWrapper<BillingModel> billingModelQueryWrapper = new QueryWrapper<>();
+//        billingModelQueryWrapper.eq("device_imei", imei);
+//        BillingModel model = billingModelService.getOne(billingModelQueryWrapper);
+//
+//        orderStatusQueryWrapper.eq("device_imei", imei)
+//                .eq("guns_code", port)
+//                .orderByDesc("create_time"
+//                ).last("limit 1");
+//        OrderStatus statusServiceOne = orderStatusService.getOne(orderStatusQueryWrapper);
+//        statusServiceOne.setEndTime(System.currentTimeMillis());
+//        DeviceConnectionMsg deviceConnection = socketHandle.getDeviceConnection(statusServiceOne.getPileCode());
+//
+//        if (status == 1) {
+//            logger.info(statusServiceOne.getPileCode() + ":急停停充>>>上报交易记录>>>");
+//            byte[] encrypt = new byte[0];
+//            if (port == 1) {
+//                //急停停充:急停状态下:1.向设备发起结束充电,结算交易订单(交给结束充电处理;但是要考虑是急停的原因),2.上报的充电结束的订单式
+//
+//                Map<String, BigDecimal> map = transMoney.compute(1, model, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime());
+//
+//                encrypt = transactionFlowPushFrame.sendTrans(deviceConnection, statusServiceOne.getTransOrder(), statusServiceOne.getPileCode(), (byte) 1, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime(), model, statusServiceOne.getCard(), map, TransConstant.EMERGENCY_STOP_EXCEPTION_STOP);
+//            } else if (port == 2) {
+//                //TODO:这里还是模拟数据上报
+//
+//                Map<String, BigDecimal> map = transMoney.compute(2, model, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime());
+//                //模拟3.5千瓦
+//                encrypt = transactionFlowPushFrame.sendTrans(deviceConnection, statusServiceOne.getTransOrder(), statusServiceOne.getPileCode(), (byte) 2, statusServiceOne.getCreateTime(), statusServiceOne.getEndTime(), model, statusServiceOne.getCard(), map, TransConstant.EMERGENCY_STOP_EXCEPTION_STOP);
+//            }
+//            statusServiceOne.setOriginalText(encrypt);
+//            statusServiceOne.setReasonStopCharging(TransConstant.EMERGENCY_STOP_EXCEPTION_STOP);
+//            statusServiceOne.setStopChargingReply(StatusConstant.STOP_CHARGING_REPLY_OK);
+//            statusServiceOne.setNowOrderStatus(StatusConstant.NOW_ORDER_STATUS_CHARGING_ENDING);
+//            statusServiceOne.setTransactionOrderReportingActionStatus(StatusConstant.TRANSACTION_ORDER_REPORTING_ACTION_STATUS_OK);
+//            orderStatusService.updateById(statusServiceOne);
+//        }
     }
 
     //启动充电
@@ -635,7 +659,9 @@ public class DeviceMsgHandle {
             //如果是用户手动停止充电 则不处理状态
             if (statusServiceOne.getReasonStopCharging() == TransConstant.APP_REMOTE_STOP) {
                 logger.info(statusServiceOne.getPileCode() + ":云快充>>>>>>远程停充>>>>");
-            } else {
+            } else if(statusServiceOne.getReasonStopCharging()==TransConstant.EMERGENCY_STOP_EXCEPTION_STOP){
+                logger.info(statusServiceOne.getPileCode() + ":云快充>>>>>>急停停止>>>>");
+            }else {
                 if(statusServiceOne.getReasonStopCharging()==0){
                     logger.info(statusServiceOne.getPileCode() + ":充满主动>>>>>>停充>>>>");
                     statusServiceOne.setReasonStopCharging(TransConstant.MANUAL_STOP);
@@ -725,6 +751,10 @@ public class DeviceMsgHandle {
         if(portStatus>20){
             return;
         }
+        //端口可能干扰导致为错误的端口
+        if(port>2){
+            return;
+        }
 
         if (portStatus.equals(PortStatusConstant.FREE)) {
             //处理特殊情况之后还要看枪状态变位上送

Plik diff jest za duży
+ 690 - 689
src/main/java/com/tmzn/devicelinkykc/message/YkcMsgHandle.java