liuf 1 год назад
Родитель
Сommit
3c66c277c6
22 измененных файлов с 335 добавлено и 146 удалено
  1. 2 1
      src/main/java/com/tmzn/devicelinkykc/controller/TestController.java
  2. 10 3
      src/main/java/com/tmzn/devicelinkykc/frameMsg/FrameDataSplicing.java
  3. 52 13
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/BillingModelFrame.java
  4. 35 8
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/CharngingPushFrame.java
  5. 1 1
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/CheckTime.java
  6. 1 1
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/HeartFrameSend.java
  7. 5 5
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/LoginFrame.java
  8. 27 11
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/RealTimeStatusPushFrame.java
  9. 30 10
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/RemoteBalanceUpdatePushFrame.java
  10. 50 10
      src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/TransactionFlowPushFrame.java
  11. 5 5
      src/main/java/com/tmzn/devicelinkykc/message/DeviceMsgHandle.java
  12. 6 4
      src/main/java/com/tmzn/devicelinkykc/message/YkcMsgHandle.java
  13. 7 0
      src/main/java/com/tmzn/devicelinkykc/msgEnum/DeviceSendYkc.java
  14. 3 0
      src/main/java/com/tmzn/devicelinkykc/msgEnum/YkcSendDevice.java
  15. 11 1
      src/main/java/com/tmzn/devicelinkykc/socket/DeviceConnectionMsg.java
  16. 3 2
      src/main/java/com/tmzn/devicelinkykc/socket/SocketHandle.java
  17. 58 57
      src/main/java/com/tmzn/devicelinkykc/taskQueue/DeviceOnlineTask.java
  18. 1 1
      src/main/java/com/tmzn/devicelinkykc/taskQueue/HeartTask.java
  19. 21 6
      src/main/java/com/tmzn/devicelinkykc/taskQueue/TransCheckTask.java
  20. 2 2
      src/main/java/com/tmzn/devicelinkykc/taskQueue/queue/TaskRunner.java
  21. 1 1
      src/main/resources/application-dev.yml
  22. 4 4
      src/main/resources/application-test.yml

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

@@ -54,12 +54,13 @@ public class TestController {
     private DeviceMsgHandle deviceMsgHandle;
 
     @PostMapping("/msg")
-    public void testMsg(@RequestBody String message) {
+    public String testMsg(@RequestBody String message) {
         try {
             deviceMsgHandle.testMsg(message);
         } catch (Exception e) {
             e.printStackTrace();
         }
+        return "ok";
     }
 
     @GetMapping("/test")

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

@@ -12,6 +12,9 @@ import java.util.Date;
  * @explain " 帧数据拼接 "
  */
 public class FrameDataSplicing {
+
+
+
     /**
      *
      * @param seq  序列号
@@ -21,7 +24,7 @@ public class FrameDataSplicing {
      * @param length           长度
      * @return
      */
-    public static byte[] spliceing(int seq, int frameType, int encryptFlag, byte[] data, int length) {
+    public static byte[] spliceing(int seq, int frameType, int encryptFlag, byte[] data, int length,boolean is18) {
         byte[] outBuf = new byte[8 + data.length];
         int index = 0;
         outBuf[index++] = (byte) 0x68; //其实字节
@@ -33,8 +36,12 @@ public class FrameDataSplicing {
         outBuf[index++] = (byte) frameType;
         System.arraycopy(data, 0, outBuf, index, length);
         index += length;
-        int crc = modbusCRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
-        int crc16 = modbus16CRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
+        int crc = 0;
+        if(is18){
+             crc = modbusCRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
+        }else{
+             crc = modbus16CRC(Arrays.copyOfRange(outBuf, 2, index), index - 2);
+        }
         outBuf[index++] = (byte) (crc & 0x00FF);
         outBuf[index++] = (byte) ((crc >> 8) & 0x00FF);
         System.out.println("发送消息>>>"+ DeviceSendYkc.getNameByframeType(frameType)+">>>>>>>>>>"+DataConversion.bytesToHexString(outBuf));

+ 52 - 13
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/BillingModelFrame.java

@@ -30,17 +30,30 @@ public class BillingModelFrame {
      * @param deviceConnectionMsg
      */
     public  void checkBillingModel(DeviceConnectionMsg deviceConnectionMsg){
+
         byte[] params = checkModel(deviceConnectionMsg);
-        String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
 
-        byte[] encrypt = new byte[0];
-        try {
-            encrypt = Encrytion.aesEncrypt(params, key.getBytes());
-        } catch (Exception e) {
-            e.printStackTrace();
+        if(deviceConnectionMsg.getIs18()){
+            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+            byte[] encrypt = new byte[0];
+            try {
+                encrypt = Encrytion.aesEncrypt(params, key.getBytes());
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_VALIDATE_REQUEST.getFrameType(), DeviceSendYkc.BILLING_MODEL_VALIDATE_REQUEST.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+            try {
+                deviceConnectionMsg.getOutputStream().write(spliceing);
+                deviceConnectionMsg.getOutputStream().flush();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            deviceConnectionMsg.incrementMessageCount();
+            return;
         }
-        byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_VALIDATE_REQUEST.getFrameType(), DeviceSendYkc.BILLING_MODEL_VALIDATE_REQUEST.getEncryptFlag(), encrypt, encrypt.length);
 
+        //非1.8版本不加密
+        byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_VALIDATE_REQUEST.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
         try {
             deviceConnectionMsg.getOutputStream().write(spliceing);
             deviceConnectionMsg.getOutputStream().flush();
@@ -48,6 +61,8 @@ public class BillingModelFrame {
             e.printStackTrace();
         }
         deviceConnectionMsg.incrementMessageCount();
+
+
     }
     private byte[] checkModel(DeviceConnectionMsg deviceConnectionMsg){
         String deviceId = deviceConnectionMsg.getDeviceId();
@@ -68,11 +83,22 @@ public class BillingModelFrame {
      */
     public  void getBillingModel(DeviceConnectionMsg deviceConnectionMsg){
         byte[] params = getModelParams(deviceConnectionMsg);
-        String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+        if(deviceConnectionMsg.getIs18()){
+            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+            try {
+                byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
+                byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_REQUEST.getFrameType(), DeviceSendYkc.BILLING_MODEL_REQUEST.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                deviceConnectionMsg.getOutputStream().write(spliceing);
+                deviceConnectionMsg.getOutputStream().flush();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            deviceConnectionMsg.incrementMessageCount();
+            return;
+        }
 
         try {
-            byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
-            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_REQUEST.getFrameType(), DeviceSendYkc.BILLING_MODEL_REQUEST.getEncryptFlag(), encrypt, encrypt.length);
+            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_REQUEST.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
             deviceConnectionMsg.getOutputStream().write(spliceing);
             deviceConnectionMsg.getOutputStream().flush();
         } catch (Exception e) {
@@ -95,16 +121,29 @@ public class BillingModelFrame {
      */
     public void resp(DeviceConnectionMsg deviceConnectionMsg,byte res){
         byte[] params = params(deviceConnectionMsg.getDeviceId(),res);
-        String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+        if(deviceConnectionMsg.getIs18()){
+            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+            try {
+                byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
+                byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_SETTING_RESPONSE.getFrameType(), DeviceSendYkc.BILLING_MODEL_SETTING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                deviceConnectionMsg.getOutputStream().write(spliceing);
+                deviceConnectionMsg.getOutputStream().flush();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            deviceConnectionMsg.incrementMessageCount();
+            return;
+        }
+
         try {
-            byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
-            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_SETTING_RESPONSE.getFrameType(), DeviceSendYkc.BILLING_MODEL_SETTING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length);
+            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.BILLING_MODEL_SETTING_RESPONSE.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
             deviceConnectionMsg.getOutputStream().write(spliceing);
             deviceConnectionMsg.getOutputStream().flush();
         } catch (Exception e) {
             e.printStackTrace();
         }
         deviceConnectionMsg.incrementMessageCount();
+
     }
 
     private byte[] params(String pileCode,byte res){

+ 35 - 8
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/CharngingPushFrame.java

@@ -34,15 +34,28 @@ public class CharngingPushFrame {
      */
     public void startStatus(DeviceConnectionMsg deviceConnectionMsg,byte[] trans,int port,int result,int reson){
         byte[] params = startParams(deviceConnectionMsg.getDeviceId(), trans, port, result, reson);
-        log.info("startStatus>开始充电回复>>>"+DataConversion.bytesToHexString(params));
-        String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+        log.info("{}startStatus>开始充电回复>>>"+DataConversion.bytesToHexString(params),deviceConnectionMsg.getDeviceId());
+        if(deviceConnectionMsg.getIs18()){
+            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+            try {
+                byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
+                byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.START_CHARNGING_RESPONSE.getFrameType(), DeviceSendYkc.START_CHARNGING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                deviceConnectionMsg.getOutputStream().write(spliceing);
+                deviceConnectionMsg.getOutputStream().flush();
+            } catch (Exception e) {
+                log.info("{}startStatus>充电回复异常>>>"+DataConversion.bytesToHexString(params)+e.getMessage(),deviceConnectionMsg.getDeviceId());
+                e.printStackTrace();
+            }
+            deviceConnectionMsg.incrementMessageCount();
+            return;
+        }
+
         try {
-            byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
-            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.START_CHARNGING_RESPONSE.getFrameType(), DeviceSendYkc.START_CHARNGING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length);
+            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.START_CHARNGING_RESPONSE_16.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
             deviceConnectionMsg.getOutputStream().write(spliceing);
             deviceConnectionMsg.getOutputStream().flush();
         } catch (Exception e) {
-            log.info("startStatus>充电回复异常>>>"+DataConversion.bytesToHexString(params)+e.getMessage());
+            log.info("{}startStatus>充电回复异常>>>"+DataConversion.bytesToHexString(params)+e.getMessage(),deviceConnectionMsg.getDeviceId());
             e.printStackTrace();
         }
         deviceConnectionMsg.incrementMessageCount();
@@ -85,10 +98,23 @@ public class CharngingPushFrame {
     public void endStatus(DeviceConnectionMsg deviceConnectionMsg,int port,int result,int reson){
         byte[] params = endParams(deviceConnectionMsg.getDeviceId(), port, result, reson);
         log.info("endStatus>停止充电回复>>>"+DataConversion.bytesToHexString(params));
-        String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+
+        if(deviceConnectionMsg.getIs18()){
+            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+            try {
+                byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
+                byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getFrameType(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                deviceConnectionMsg.getOutputStream().write(spliceing);
+                deviceConnectionMsg.getOutputStream().flush();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            deviceConnectionMsg.incrementMessageCount();
+            return;
+        }
+
         try {
-            byte[] encrypt = Encrytion.aesEncrypt(params, key.getBytes());
-            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getFrameType(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length);
+            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
             deviceConnectionMsg.getOutputStream().write(spliceing);
             deviceConnectionMsg.getOutputStream().flush();
         } catch (Exception e) {
@@ -96,6 +122,7 @@ public class CharngingPushFrame {
         }
         deviceConnectionMsg.incrementMessageCount();
 
+
     }
     private byte[] endParams(String pileCode,int port,int result,int reson){
 

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

@@ -24,7 +24,7 @@ public class CheckTime {
     public void checkTimeSend(DeviceConnectionMsg deviceConnectionMsg) {
         byte[] bytes = charngTime(deviceConnectionMsg);
         log.info("checkTimeSend>设备校时上送>>>"+DataConversion.bytesToHexString(bytes));
-        byte[] pack = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.CHECKTIME_RESPONSE.getFrameType(), DeviceSendYkc.CHECKTIME_RESPONSE.getEncryptFlag(), bytes, bytes.length);
+        byte[] pack = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.CHECKTIME_RESPONSE.getFrameType(), DeviceSendYkc.CHECKTIME_RESPONSE.getEncryptFlag(), bytes, bytes.length, deviceConnectionMsg.getIs18());
         try {
             deviceConnectionMsg.getOutputStream().write(pack);
             deviceConnectionMsg.getOutputStream().flush();

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

@@ -23,7 +23,7 @@ public class HeartFrameSend {
     public void 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);
+        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();

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

@@ -41,11 +41,11 @@ public class LoginFrame {
     public void loginMsgSend(DeviceConnectionMsg deviceConnectionMsg,Device device){
         byte[] send = new byte[0];
         try {
-            System.out.println(device.getCommProtocolVer());
-            if(!device.getCommProtocolVer().startsWith("1.8")){
-                send = loginMsgNot18(device);
-            }else{
+
+            if(deviceConnectionMsg.getIs18()){
                 send = loginMsg18(device);
+            }else{
+                send = loginMsgNot18(device);
             }
 
         } catch (Exception e) {
@@ -54,7 +54,7 @@ public class LoginFrame {
         }
         if (send.length>0) {
             log.info("loginMsgSend>设备登录消息上送>>>"+DataConversion.bytesToHexString(send));
-            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.LOGIN.getFrameType(), DeviceSendYkc.LOGIN.getEncryptFlag(), send, send.length);
+            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.LOGIN.getFrameType(), DeviceSendYkc.LOGIN.getEncryptFlag(), send, send.length, deviceConnectionMsg.getIs18());
             try {
                 deviceConnectionMsg.getOutputStream().write(bytes);
                 deviceConnectionMsg.getOutputStream().flush();

+ 27 - 11
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/RealTimeStatusPushFrame.java

@@ -31,19 +31,35 @@ public class RealTimeStatusPushFrame {
 
     public void deviceStatusPush(DeviceConnectionMsg deviceConnectionMsg, byte[] trans, String pileCode, byte guns, byte gunsStatus, byte gunsInsert, double voltage, double power, BigDecimal elec, BigDecimal money, int time) {
         byte[] encrypt = new byte[0];
-        try {
-            byte[] send = upStatusDevice(trans, pileCode, guns, gunsStatus, gunsInsert, voltage, power, elec, money, time);
-            log.info("deviceStatusPush>设备实时状态上报>>>"+DataConversion.bytesToHexString(send));
-            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
-           // log.info("deviceStatusPush>设备实时状态key>>>"+key);
-            encrypt = Encrytion.aesEncrypt(send, key.getBytes());
-            log.info("deviceStatusPush>设备实时状态encrypt msg::>>>"+DataConversion.bytesToHexString(encrypt));
-        } catch (Exception e) {
-            log.info("pileCode:" + pileCode + " deviceStatusPush params Exception");
-            e.printStackTrace();
+
+        int encFlag = DeviceSendYkc.UPLOAD_DEVICE_STATUS_RESPONSE.getEncryptFlag();
+        if(deviceConnectionMsg.getIs18()){
+            try {
+                byte[] send = upStatusDevice(trans, pileCode, guns, gunsStatus, gunsInsert, voltage, power, elec, money, time);
+                log.info("deviceStatusPush>设备实时状态上报>>>"+DataConversion.bytesToHexString(send));
+                String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+                // log.info("deviceStatusPush>设备实时状态key>>>"+key);
+                encrypt = Encrytion.aesEncrypt(send, key.getBytes());
+                log.info("deviceStatusPush>设备实时状态encrypt msg::>>>"+DataConversion.bytesToHexString(encrypt));
+            } catch (Exception e) {
+                log.info("pileCode:" + pileCode + " deviceStatusPush params Exception");
+                e.printStackTrace();
+            }
+        }else{
+            try {
+                byte[] send = upStatusDevice(trans, pileCode, guns, gunsStatus, gunsInsert, voltage, power, elec, money, time);
+                log.info("deviceStatusPush>设备实时状态上报>>>"+DataConversion.bytesToHexString(send));
+                // log.info("deviceStatusPush>设备实时状态key>>>"+key);
+                encrypt = send;
+                encFlag = 0;
+            } catch (Exception e) {
+                log.info("pileCode:" + pileCode + " deviceStatusPush params Exception");
+                e.printStackTrace();
+            }
         }
+
         if (encrypt.length > 0) {
-            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.UPLOAD_DEVICE_STATUS_RESPONSE.getFrameType(), DeviceSendYkc.UPLOAD_DEVICE_STATUS_RESPONSE.getEncryptFlag(), encrypt, encrypt.length);
+            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.UPLOAD_DEVICE_STATUS_RESPONSE.getFrameType() ,encFlag, encrypt, encrypt.length, deviceConnectionMsg.getIs18());
             try {
                 deviceConnectionMsg.getOutputStream().write(bytes,0,bytes.length);
                 deviceConnectionMsg.getOutputStream().flush();

+ 30 - 10
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/RemoteBalanceUpdatePushFrame.java

@@ -27,17 +27,36 @@ public class RemoteBalanceUpdatePushFrame {
 
     public void updateBalance(DeviceConnectionMsg deviceConnectionMsg,byte[] card,byte reason){
         byte[] encrypt = new byte[0];
-        try {
-            byte[] send = params(deviceConnectionMsg.getDeviceId(), card,reason);
-            log.info("updateBalance>更新余额回复>>>"+DataConversion.bytesToHexString(send));
-            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
-            encrypt = Encrytion.aesEncrypt(send, key.getBytes());
-        } catch (Exception e) {
-            log.info("pileCode:" + deviceConnectionMsg.getDeviceId() + " updateBalance params Exception");
-            e.printStackTrace();
+        if(deviceConnectionMsg.getIs18()){
+            try {
+                byte[] send = params(deviceConnectionMsg.getDeviceId(), card,reason);
+                log.info("updateBalance>更新余额回复>>>"+DataConversion.bytesToHexString(send));
+                String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+                encrypt = Encrytion.aesEncrypt(send, key.getBytes());
+            } catch (Exception e) {
+                log.info("pileCode:" + deviceConnectionMsg.getDeviceId() + " updateBalance params Exception");
+                e.printStackTrace();
+            }
+            if (encrypt.length > 0) {
+                byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getFrameType(), DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                try {
+                    deviceConnectionMsg.getOutputStream().write(bytes);
+                    deviceConnectionMsg.getOutputStream().flush();
+                } catch (IOException e) {
+                    log.info("pileCode:" + deviceConnectionMsg.getDeviceId() + " ,updateBalance push frame Exception");
+                    e.printStackTrace();
+                }
+                deviceConnectionMsg.incrementMessageCount();
+            } else {
+                log.info("pileCode:" + deviceConnectionMsg.getDeviceId() + " updateBalance params null");
+            }
+            return;
         }
-        if (encrypt.length > 0) {
-            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getFrameType(), DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getEncryptFlag(), encrypt, encrypt.length);
+        byte[] send = params(deviceConnectionMsg.getDeviceId(), card,reason);
+        log.info("updateBalance>更新余额回复>>>"+DataConversion.bytesToHexString(send));
+        log.info("pileCode:" + deviceConnectionMsg.getDeviceId() + " updateBalance params Exception");
+        if (send.length > 0) {
+            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getFrameType(), 0, send, send.length, deviceConnectionMsg.getIs18());
             try {
                 deviceConnectionMsg.getOutputStream().write(bytes);
                 deviceConnectionMsg.getOutputStream().flush();
@@ -49,6 +68,7 @@ public class RemoteBalanceUpdatePushFrame {
         } else {
             log.info("pileCode:" + deviceConnectionMsg.getDeviceId() + " updateBalance params null");
         }
+
     }
 
 

+ 50 - 10
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/TransactionFlowPushFrame.java

@@ -55,6 +55,49 @@ public class TransactionFlowPushFrame {
 
     public byte[] sendTrans(DeviceConnectionMsg deviceConnectionMsg,byte[] transOrder, String pileCode, byte gunPort, long createTime, long endTime, BillingModel billingModel, byte[] card, Map<String, BigDecimal> map,int reason)  {
 
+        if(deviceConnectionMsg.getIs18()){
+            byte[] encrypt = new byte[0];
+            // 缓存上报的订单,上报失败30秒重试,
+            TransCheck transCheck = new TransCheck();
+            try {
+                //密钥变化这里存订单明文
+                byte[] params = params(transOrder, pileCode, gunPort, createTime, endTime, billingModel, card, map,reason);
+                transCheck.setTrans(params);
+                transCheck.setCheck_time(0);
+                transCheck.setTime(System.currentTimeMillis());
+
+                //log.info("sendTrans>订单上送>>>"+DataConversion.bytesToHexString(params));
+                String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+                log.info("key>订单消息加密密钥>>>"+key);
+                encrypt = Encrytion.aesEncrypt(params, key.getBytes());
+                log.info("msg>订单加密消息>>>"+DataConversion.bytesToHexString(encrypt));
+            } catch (Exception e) {
+                log.info("pileCode:" + pileCode + " TransactionFlowPush params Exception");
+                e.printStackTrace();
+                return pileCode.getBytes();
+            }
+            if (encrypt.length > 0) {
+                byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getFrameType(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                try {
+                    //outputStream..write(bytes)
+                    //log.info("bytes>上送订单加密消息>>>"+DataConversion.bytesToHexString(bytes));
+                    // log.info("bytes.length>上送订单加密length>>>"+bytes.length);
+                    deviceConnectionMsg.getOutputStream().write(bytes);
+                    deviceConnectionMsg.getOutputStream().flush();
+
+                    //只有发送了才将校验订单写到redis里
+                    redisCache.setCacheObject(RedisConstant.NO_RESPONSE_WAS_RECEIVED+pileCode,transCheck,6,TimeUnit.MINUTES);
+                } catch (IOException e) {
+                    log.info("pileCode:" + pileCode + " ,TransactionFlow push frame Exception");
+                    e.printStackTrace();
+                }
+                deviceConnectionMsg.incrementMessageCount();
+            } else {
+                log.info("pileCode:" + pileCode + " transactionFlowPush params null");
+            }
+            return encrypt;
+        }
+
         byte[] encrypt = new byte[0];
         // 缓存上报的订单,上报失败30秒重试,
         TransCheck transCheck = new TransCheck();
@@ -64,25 +107,20 @@ public class TransactionFlowPushFrame {
             transCheck.setTrans(params);
             transCheck.setCheck_time(0);
             transCheck.setTime(System.currentTimeMillis());
-
-            //log.info("sendTrans>订单上送>>>"+DataConversion.bytesToHexString(params));
-            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
-            log.info("key>订单消息加密密钥>>>"+key);
-            encrypt = Encrytion.aesEncrypt(params, key.getBytes());
-            log.info("msg>订单加密消息>>>"+DataConversion.bytesToHexString(encrypt));
+            encrypt = params;
         } catch (Exception e) {
             log.info("pileCode:" + pileCode + " TransactionFlowPush params Exception");
             e.printStackTrace();
             return pileCode.getBytes();
         }
         if (encrypt.length > 0) {
-            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getFrameType(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getEncryptFlag(), encrypt, encrypt.length);
+            byte[] bytes = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST_16.getFrameType(), 0, encrypt, encrypt.length, deviceConnectionMsg.getIs18());
             try {
                 //outputStream..write(bytes)
                 //log.info("bytes>上送订单加密消息>>>"+DataConversion.bytesToHexString(bytes));
-               // log.info("bytes.length>上送订单加密length>>>"+bytes.length);
-                    deviceConnectionMsg.getOutputStream().write(bytes);
-                    deviceConnectionMsg.getOutputStream().flush();
+                // log.info("bytes.length>上送订单加密length>>>"+bytes.length);
+                deviceConnectionMsg.getOutputStream().write(bytes);
+                deviceConnectionMsg.getOutputStream().flush();
 
                 //只有发送了才将校验订单写到redis里
                 redisCache.setCacheObject(RedisConstant.NO_RESPONSE_WAS_RECEIVED+pileCode,transCheck,6,TimeUnit.MINUTES);
@@ -95,6 +133,8 @@ public class TransactionFlowPushFrame {
             log.info("pileCode:" + pileCode + " transactionFlowPush params null");
         }
         return encrypt;
+
+
     }
 
     public byte[] params(byte[] transOrder, String pileCode, byte gunPort, long createTime, long endTime, BillingModel billingModel, byte[] card, Map<String, BigDecimal> map,int reason) {

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

@@ -666,7 +666,7 @@ public class DeviceMsgHandle {
                     QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>();
                     deviceQueryWrapper.eq("pile_code", one.getPileCode()).eq("disabled", DeviceOnlineStatus.NORMAL);
                     Device device = deviceService.getOne(deviceQueryWrapper);
-                    socketHandle.addDeviceConnection(device.getIp(),port,one.getPileCode(), one.getDeviceImei(), one.getDeviceSn());
+                    socketHandle.addDeviceConnection(device.getIp(),port,one.getPileCode(), one.getDeviceImei(), one.getDeviceSn(),device.getCommProtocolVer());
                     loginFrame.loginMsgSend(socketHandle.getDeviceConnection(one.getPileCode()), device);
                     //从新登录可能造成通讯上的问题,这里不在往下进行状态操作
                 } catch (IOException e) {
@@ -806,10 +806,10 @@ public class DeviceMsgHandle {
             try {
 
                 logger.info("{}设备上线>>>>>>",device.getPileCode());
-                socketHandle.addDeviceConnection(device.getIp(),device.getPort(),statusServiceOne.getPileCode(), statusServiceOne.getDeviceImei(), statusServiceOne.getDeviceSn());
+                socketHandle.addDeviceConnection(device.getIp(),device.getPort(),statusServiceOne.getPileCode(), statusServiceOne.getDeviceImei(), statusServiceOne.getDeviceSn(),device.getCommProtocolVer());
                 loginFrame.loginMsgSend(socketHandle.getDeviceConnection(statusServiceOne.getPileCode()), device);
                 //从新登录可能造成通讯上的问题,这里不在往下进行状态操作
-                return;
+               // return;
             } catch (IOException e) {
                 logger.info("device:" + statusServiceOne.getDeviceSn() + " open socket Exception!!!");
                 e.printStackTrace();
@@ -821,7 +821,7 @@ public class DeviceMsgHandle {
                 //不正常,移除再连接
                 socketHandle.removeDeviceConnection(statusServiceOne.getPileCode());
                 try {
-                    socketHandle.addDeviceConnection(device.getIp(),device.getPort(),statusServiceOne.getPileCode(), statusServiceOne.getDeviceImei(), statusServiceOne.getDeviceSn());
+                    socketHandle.addDeviceConnection(device.getIp(),device.getPort(),statusServiceOne.getPileCode(), statusServiceOne.getDeviceImei(), statusServiceOne.getDeviceSn(),device.getCommProtocolVer());
                 } catch (IOException e) {
                     e.printStackTrace();
                 }
@@ -859,7 +859,7 @@ public class DeviceMsgHandle {
         if (statusServiceOneTemp.getGunStatus() != gunsStatus || statusServiceOneTemp.getInsertGunStatus() != insertGunStatus) {
             if (!socketHandle.existDeviceConnection(statusServiceOne.getPileCode())) {
                 try {
-                    socketHandle.addDeviceConnection(device.getIp(),device.getPort(),statusServiceOne.getPileCode(), statusServiceOne.getDeviceImei(), statusServiceOne.getDeviceSn());
+                    socketHandle.addDeviceConnection(device.getIp(),device.getPort(),statusServiceOne.getPileCode(), statusServiceOne.getDeviceImei(), statusServiceOne.getDeviceSn(),device.getCommProtocolVer());
                 } catch (IOException e) {
                     e.printStackTrace();
                 }

+ 6 - 4
src/main/java/com/tmzn/devicelinkykc/message/YkcMsgHandle.java

@@ -150,7 +150,7 @@ public class YkcMsgHandle {
 
                 } else if (framType == YkcSendDevice.HEART_RESPONSE.getFrameType()) {
                     //TODO:个人理解,枪不管故障还是正常都会有心跳,心跳应答正常说明设备是正常的状态,所以这里不管是同一设备的几号枪心跳都缓存下来心跳应答时间
-                    logger.info("ykc->dev"+deviceConnectionMsg.getDeviceId()+"↓↓↓↓↓↓↓↓↓↓↓↓↓心跳包应答消息↓↓↓↓↓↓↓↓↓↓↓↓↓"+framType);
+                  //  logger.info("ykc->dev"+deviceConnectionMsg.getDeviceId()+"↓↓↓↓↓↓↓↓↓↓↓↓↓心跳包应答消息↓↓↓↓↓↓↓↓↓↓↓↓↓"+framType);
                     deviceConnectionMsg.setHeartTime(System.currentTimeMillis());
                     logger.info("===========心跳包应答============over");
 
@@ -193,7 +193,7 @@ public class YkcMsgHandle {
                 } else if (framType == YkcSendDevice.DEVICE_STATUS_REQUEST.getFrameType()) {
                     logger.info("ykc->dev↓↓↓↓↓↓↓↓↓↓↓↓↓读取实时监测数据↓↓↓↓↓↓↓↓↓↓↓↓↓");
 
-                } else if (framType == YkcSendDevice.START_CHARNGING_REQUEST.getFrameType()) {
+                } else if (framType == YkcSendDevice.START_CHARNGING_REQUEST.getFrameType() || framType==YkcSendDevice.START_CHARNGING_REQUEST_16.getFrameType()) {
                     logger.info("ykc->dev↓↓↓↓↓↓↓↓↓↓↓↓↓运营平台远程控制启机↓↓↓↓↓↓↓↓↓↓↓↓↓"+framType);
                     startChargingRequest(deviceConnectionMsg, respone_msg);
 
@@ -247,10 +247,11 @@ public class YkcMsgHandle {
         int login_result = respone_msg[7] & 0xFF;
         if (ResultUtil.isSuccess(login_result)) {
             //登录成功,相当于初始化心跳包接收时间更新,初始化心跳包时间相当于登录成功,心跳包能正常上传
+            logger.info("{}login successfully",deviceConnectionMsg.getImei());
             deviceConnectionMsg.setHeartTime(System.currentTimeMillis());
             deviceConnectionMsg.setLoginStatus(Constant.DEVICE_LOGIN_STATUS);
         } else {
-            logger.info("pileCode:" + deviceConnectionMsg.getDeviceId() + " login error!!!waiting for retry");
+            logger.info("{}login failed ,waitting for retry",deviceConnectionMsg.getImei());
             //登录失败等心跳包10秒后进行重试
         }
     }
@@ -393,8 +394,9 @@ private  static  byte[] t=new byte[16];
     private void billingModelHandle(DeviceConnectionMsg deviceConnectionMsg, byte[] respone_msg) {
         byte[] modelNum = Arrays.copyOfRange(respone_msg, 7, 9);
         byte[] result = Arrays.copyOfRange(respone_msg, 9, 10);
-        logger.info("登录成功计费模型验证应答"+deviceConnectionMsg.getDeviceId()+">>modelNum:"+DataConversion.bytesToHexString(modelNum) +";result:"+DataConversion.bytesToHexString(result));
+        logger.info("计费模型验证应答"+deviceConnectionMsg.getDeviceId()+">>modelNum:"+DataConversion.bytesToHexString(modelNum) +";result:"+DataConversion.bytesToHexString(result));
         if (result[0] == BillingModelConst.DIFFERENT) {
+            logger.info("获取计费模型{}",deviceConnectionMsg.getDeviceId());
             //不一致请求计费模型,再向平台请求计费模型0x09
             billingModelFrame.getBillingModel(deviceConnectionMsg);
         }

+ 7 - 0
src/main/java/com/tmzn/devicelinkykc/msgEnum/DeviceSendYkc.java

@@ -11,7 +11,9 @@ public enum DeviceSendYkc {
     BILLING_MODEL_VALIDATE_REQUEST(0x05,0x01,"计费模型验证请求"),
     BILLING_MODEL_REQUEST(0x09,0x01,"充电桩计费模型请求"),
     TRANSACTION_RECORDS_REQUEST(0x3D,0x01,"交易记录"),
+    TRANSACTION_RECORDS_REQUEST_16(0x3B,0x01,"交易记录"),
 
+    // 0x31-0x34 报文变更为 0xA5-0xA8 报文
     UPLOAD_DEVICE_STATUS_RESPONSE(0x13,0x01,"设备上报平台状态"),
     START_CHARNGING_RESPONSE(0xA7,0x01,"运营平台远程控制启机回复"),
     STOP_CHARNGING_RESPONSE(0x35,0x01,"远程停机命令回复"),
@@ -20,6 +22,11 @@ public enum DeviceSendYkc {
     BILLING_MODEL_SETTING_RESPONSE(0x57,0x01," 计费模型设置应答"),
     REMOTE_REBOOT_RESPONSE(0x93,0x01,"远程重启应答"),
     UPLOAD_FILE_UPDATE_RESPONSE(0x93,0x01,"远程更新应答"),
+
+
+    START_CHARNGING_RESPONSE_16(0x33,0x00,"运营平台远程控制启机回复"),
+
+
     ;
 
     private int frameType;          //帧类型

+ 3 - 0
src/main/java/com/tmzn/devicelinkykc/msgEnum/YkcSendDevice.java

@@ -19,6 +19,9 @@ public enum YkcSendDevice {
     CHECKTIME(0x56,0x00," 对时设置"),
     BILLING_MODEL_SETTING(0x58,0x01," 计费模型设置"),
     REMOTE_REBOOT(0x92,0x01," 远程重启"),
+
+    START_CHARNGING_REQUEST_16(0x34,0x01,"运营平台远程控制启机"),
+
     UPLOAD_FILE_UPDATE(0x94,0x01," 远程更新")
     ;
     private int frameType;          //帧类型

+ 11 - 1
src/main/java/com/tmzn/devicelinkykc/socket/DeviceConnectionMsg.java

@@ -21,8 +21,10 @@ public class DeviceConnectionMsg {
     private BufferedOutputStream outputStream;
     private BufferedInputStream inputStream;
     private Integer loginStatus;
+    private boolean is18;
+    private String ver;
 
-    public DeviceConnectionMsg(Socket socket, String deviceId,String imei,String deviceSn) {
+    public DeviceConnectionMsg(Socket socket, String deviceId,String imei,String deviceSn,String ver) {
         this.heartTime= 0L;
         this.deviceId = deviceId;
         this.socket = socket;
@@ -30,6 +32,11 @@ public class DeviceConnectionMsg {
         this.loginStatus=0;
         this.imei=imei;
         this.deviceSn=deviceSn;
+        this.ver = ver;
+        this.is18 = true;
+        if(!ver.startsWith("1.8")){
+            this.is18=false;
+        }
         try {
             this.inputStream = new BufferedInputStream(socket.getInputStream()) ;
             this.outputStream =new BufferedOutputStream(socket.getOutputStream()) ;
@@ -78,6 +85,9 @@ public class DeviceConnectionMsg {
         this.messageCount++;
     }
 
+    public boolean getIs18() {
+        return is18;
+    }
 
     public Long getHeartTime() {
         return heartTime;

+ 3 - 2
src/main/java/com/tmzn/devicelinkykc/socket/SocketHandle.java

@@ -1,5 +1,6 @@
 package com.tmzn.devicelinkykc.socket;
 
+import com.sun.org.apache.xpath.internal.operations.Bool;
 import com.tmzn.devicelinkykc.message.DeviceMsgHandle;
 import com.tmzn.devicelinkykc.message.YkcMsgHandle;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -28,7 +29,7 @@ public class SocketHandle {
     @Autowired
     private YkcMsgHandle ykcMsgHandle;
 
-    public synchronized void addDeviceConnection(String ip,int port,String deviceId,String imei,String deviceSn) throws IOException {
+    public synchronized void addDeviceConnection(String ip, int port, String deviceId, String imei, String deviceSn, String ver) throws IOException {
         if (deviceConnectionMsgMap.containsKey(deviceId)) {
             return;
         }
@@ -37,7 +38,7 @@ public class SocketHandle {
         //集测
         Socket socket = new Socket(ip, port);
         socket.setKeepAlive(true);
-        DeviceConnectionMsg deviceConnectionMsg = new DeviceConnectionMsg(socket, deviceId,imei,deviceSn);
+        DeviceConnectionMsg deviceConnectionMsg = new DeviceConnectionMsg(socket, deviceId,imei,deviceSn,ver);
         //每个设备连接后开启监听接收消息
         ykcMsgHandle.startListening(deviceConnectionMsg);
         //并将连接信息等保存再Map中

+ 58 - 57
src/main/java/com/tmzn/devicelinkykc/taskQueue/DeviceOnlineTask.java

@@ -98,69 +98,70 @@ public class DeviceOnlineTask {
         });
     }
 
-    public void resetTheConnection(){
-try {
-        //差正常的设备,禁用设备不管
-        logger.info("设备连接检查");
-        QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>();
-        deviceQueryWrapper.eq("disabled", DeviceOnlineStatus.NORMAL);
-        List<Device> list = deviceService.list(deviceQueryWrapper);
-        logger.info("查询到设备"+list.size());
-        //云快充设备缓存过滤订阅消息
-        Set<String> imeiList = list.stream().map(device ->
-                device.getDeviceImei()
-        ).collect(Collectors.toSet());
-        //redisCache.setCacheObject(RedisConstant.DEVICE_INFO, imeiList, 10 * 1000 * 60, TimeUnit.MILLISECONDS);
-        redisCache.setCacheObject(RedisConstant.DEVICE_INFO,imeiList);
-
-
-        QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
-        deviceStatusQueryWrapper.eq("online_status", DeviceOnlineStatus.ONLINE);
-        List<DeviceStatus> onlineList = deviceStatusService.list(deviceStatusQueryWrapper);
-
-        List<DeviceStatus> newOnlineList = onlineList.stream().map(deviceStatus -> {
-            long updateTime = deviceStatus.getUpdateTime();
-            long nowTime = System.currentTimeMillis();
-            if ((nowTime - updateTime) > gapTime) {
-                if (socketHandle.existDeviceConnection(deviceStatus.getPileCode())) {
-                    redisCache.deleteObject(RedisConstant.KEYS + deviceStatus.getPileCode());
-                    socketHandle.removeDeviceConnection(deviceStatus.getPileCode());
+    public void resetTheConnection() {
+        try {
+            //差正常的设备,禁用设备不管
+            logger.info("设备连接检查");
+            QueryWrapper<Device> deviceQueryWrapper = new QueryWrapper<>();
+            deviceQueryWrapper.eq("disabled", DeviceOnlineStatus.NORMAL);
+            List<Device> list = deviceService.list(deviceQueryWrapper);
+            logger.info("查询到设备" + list.size());
+            //云快充设备缓存过滤订阅消息
+            Set<String> imeiList = list.stream().map(device ->
+                    device.getDeviceImei()
+            ).collect(Collectors.toSet());
+            //redisCache.setCacheObject(RedisConstant.DEVICE_INFO, imeiList, 10 * 1000 * 60, TimeUnit.MILLISECONDS);
+            redisCache.setCacheObject(RedisConstant.DEVICE_INFO, imeiList);
+
+
+            QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
+            deviceStatusQueryWrapper.eq("online_status", DeviceOnlineStatus.ONLINE);
+            List<DeviceStatus> onlineList = deviceStatusService.list(deviceStatusQueryWrapper);
+
+            List<DeviceStatus> newOnlineList = onlineList.stream().map(deviceStatus -> {
+                long updateTime = deviceStatus.getUpdateTime();
+                long nowTime = System.currentTimeMillis();
+                if ((nowTime - updateTime) > gapTime) {
+                    if (socketHandle.existDeviceConnection(deviceStatus.getPileCode())) {
+                        redisCache.deleteObject(RedisConstant.KEYS + deviceStatus.getPileCode());
+                        socketHandle.removeDeviceConnection(deviceStatus.getPileCode());
+                    }
+                    deviceStatus.setOnlineStatus(DeviceOnlineStatus.OFFLINE);
+                    //deviceStatus.setGunStatus(StatusConstant.OFFLINE);
                 }
-                deviceStatus.setOnlineStatus(DeviceOnlineStatus.OFFLINE);
-                //deviceStatus.setGunStatus(StatusConstant.OFFLINE);
+                return deviceStatus;
+            }).collect(Collectors.toList());
+
+            if (redisCache.hasKey(RedisConstant.DEVICE_INFO)) {
+                Set<String> imeis = redisCache.getCacheObject(RedisConstant.DEVICE_INFO);
+                logger.info("redis-imei>>>" + imeis.size());
             }
-            return deviceStatus;
-        }).collect(Collectors.toList());
-        if (redisCache.hasKey(RedisConstant.DEVICE_INFO)) {
-            Set<String> imeis = redisCache.getCacheObject(RedisConstant.DEVICE_INFO);
-            logger.info("redis-imei>>>" + imeis.size());
-        }
-        logger.info("dataBase device status change:" + newOnlineList.size());
-        deviceStatusService.updateBatchById(newOnlineList);
+            logger.info("dataBase device status change:" + newOnlineList.size());
+            deviceStatusService.updateBatchById(newOnlineList);
 
-        Map<String, Device> collect = list.stream().collect(Collectors.toMap(device -> device.getDeviceImei(), device -> device,(exis,repl)->exis));
+            Map<String, Device> collect = list.stream().collect(Collectors.toMap(device -> device.getDeviceImei(), device -> device, (exis, repl) -> exis));
 
-        newOnlineList.stream().forEach(deviceStatus -> {
-            //logger.info(" newOnlineList.stream().forEach");
-            if (!socketHandle.existDeviceConnection(deviceStatus.getPileCode())) {
-                try {
-                    Device device = collect.get(deviceStatus.getDeviceImei());
-                    socketHandle.addDeviceConnection(device.getIp(),device.getPort(),deviceStatus.getPileCode(), deviceStatus.getDeviceImei(), deviceStatus.getDeviceSn());
-                } catch (IOException e) {
-                    e.printStackTrace();
+            newOnlineList.stream().forEach(deviceStatus -> {
+                //logger.info(" newOnlineList.stream().forEach");
+                if (!socketHandle.existDeviceConnection(deviceStatus.getPileCode())) {
+                    try {
+                        Device device = collect.get(deviceStatus.getDeviceImei());
+                        socketHandle.addDeviceConnection(device.getIp(), device.getPort(), deviceStatus.getPileCode(), deviceStatus.getDeviceImei(), deviceStatus.getDeviceSn(), device.getCommProtocolVer());
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
                 }
-            }
-            DeviceConnectionMsg deviceConnection = socketHandle.getDeviceConnection(deviceStatus.getPileCode());
-            //logger.info("deviceConnection");
-            if (deviceConnection.getLoginStatus()== Constant.DEVICE_NOT_LOGIN_STATUS&&deviceStatus.getOnlineStatus()==DeviceOnlineStatus.ONLINE){
-                //logger.info("DEVICE_NOT_LOGIN_STATUS");
-                List<Device> collect1 = list.stream().filter(device -> device.getPileCode() .equals(deviceConnection.getDeviceId())) .collect(Collectors.toList());
-                if (collect1.size()>0){
-                    logger.info("设备连接检查login>>>"+collect1.get(0).getDeviceSn());
-                    loginFrame.loginMsgSend(deviceConnection,collect1.get(0));
+                DeviceConnectionMsg deviceConnection = socketHandle.getDeviceConnection(deviceStatus.getPileCode());
+                //logger.info("deviceConnection");
+                if (deviceConnection.getLoginStatus() == Constant.DEVICE_NOT_LOGIN_STATUS && deviceStatus.getOnlineStatus() == DeviceOnlineStatus.ONLINE) {
+                    //logger.info("DEVICE_NOT_LOGIN_STATUS");
+                    List<Device> collect1 = list.stream().filter(device -> device.getPileCode().equals(deviceConnection.getDeviceId())).collect(Collectors.toList());
+                    if (collect1.size() > 0) {
+                        logger.info("设备连接检查login>>>" + collect1.get(0).getDeviceSn());
+                        loginFrame.loginMsgSend(deviceConnection, collect1.get(0));
+                    }
                 }
-            }
-        });
+            });
         } catch (Exception e) {
             e.printStackTrace();
         }

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

@@ -48,7 +48,7 @@ public class HeartTask {
                 msgHeartQueue.add(deviceConnectionMsgMap);
             }
         };
-        scheduler.scheduleAtFixedRate(task,0,100*1000, TimeUnit.MILLISECONDS);
+        scheduler.scheduleAtFixedRate(task,0,10*1000, TimeUnit.MILLISECONDS);
 
     }
 }

+ 21 - 6
src/main/java/com/tmzn/devicelinkykc/taskQueue/TransCheckTask.java

@@ -99,15 +99,29 @@ public class TransCheckTask {
 
     }
     private void upTrans(DeviceConnectionMsg deviceConnectionMsg,byte[] bytes){
+        if(deviceConnectionMsg.getIs18()){
+            try {
+
+                String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
+                byte[] rsaEncrypt = Encrytion.aesEncrypt(bytes, key.getBytes());
+                byte[] msg = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getFrameType(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getEncryptFlag(), rsaEncrypt, rsaEncrypt.length, deviceConnectionMsg.getIs18());
+                deviceConnectionMsg.getOutputStream().write(msg);
+                deviceConnectionMsg.getOutputStream().flush();
+                log.info(deviceConnectionMsg.getDeviceId() + "Trans_chek,rsaEncrypt:"+DataConversion.bytesToHexString(rsaEncrypt));
+            } catch (IOException e) {
+                log.info("TransCheck:>>pileCode:" + deviceConnectionMsg.getDeviceId() + " ,TransactionFlow push frame Exception");
+                e.printStackTrace();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            deviceConnectionMsg.incrementMessageCount();
+            return;
+        }
         try {
-            String key = redisCache.getCacheObject(RedisConstant.KEYS+deviceConnectionMsg.getDeviceId());
-            byte[] rsaEncrypt = Encrytion.aesEncrypt(bytes, key.getBytes());
-            byte[] msg = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getFrameType(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getEncryptFlag(), rsaEncrypt, rsaEncrypt.length);
+            byte[] msg = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getFrameType(), DeviceSendYkc.TRANSACTION_RECORDS_REQUEST.getEncryptFlag(), bytes, bytes.length, deviceConnectionMsg.getIs18());
             deviceConnectionMsg.getOutputStream().write(msg);
             deviceConnectionMsg.getOutputStream().flush();
-            log.info(deviceConnectionMsg.getDeviceId() + "Trans_chek,key:"+key);
-            log.info(deviceConnectionMsg.getDeviceId() + "Trans_chek,rsaEncrypt:"+DataConversion.bytesToHexString(rsaEncrypt));
-            log.info(deviceConnectionMsg.getDeviceId() + "Trans_chek,↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑");
+            log.info(deviceConnectionMsg.getDeviceId() + "Trans_chek:"+DataConversion.bytesToHexString(bytes));
         } catch (IOException e) {
             log.info("TransCheck:>>pileCode:" + deviceConnectionMsg.getDeviceId() + " ,TransactionFlow push frame Exception");
             e.printStackTrace();
@@ -115,5 +129,6 @@ public class TransCheckTask {
             e.printStackTrace();
         }
         deviceConnectionMsg.incrementMessageCount();
+
     }
 }

+ 2 - 2
src/main/java/com/tmzn/devicelinkykc/taskQueue/queue/TaskRunner.java

@@ -131,7 +131,7 @@ public class TaskRunner {
                             }
                         }else {
                             //存在设备在线状态的,上送心跳
-                            log.info("heartSend-1>>>"+devicePileCode);
+                          //  log.info("heartSend-1>>>"+devicePileCode);
                             heartFrameSend.heartSend(deviceConnectionMsg, oneDs);
                         }
                     }
@@ -152,7 +152,7 @@ public class TaskRunner {
                             loginFrame.loginMsgSend(deviceConnectionMsg, device);
                         }
                         //存在设备在线状态的,上送心跳
-                        log.info("heartSend-2>>>"+devicePileCode);
+                      //  log.info("heartSend-2>>>"+devicePileCode);
                         heartFrameSend.heartSend(deviceConnectionMsg, twoDs);
                     }
                 }

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

@@ -5,7 +5,7 @@ spring:
     # 端口,默认为6379
     port: 6379
     # 数据库索引
-    database: 1
+    database: 2
     # 密码
     password:
   datasource:

+ 4 - 4
src/main/resources/application-test.yml

@@ -1,13 +1,13 @@
 spring:
   redis:
     # 地址
-    host: 116.62.171.226
+    host: 127.0.0.1
     # 端口,默认为6379
-    port: 6789
+    port: 6379
     # 数据库索引
-    database: 5
+    database: 2
     # 密码
-    password: Qq8575791623+-
+    password:
   datasource:
     url: jdbc:mysql://47.96.68.249:3456/wdttest?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=GMT%2B8
     username: wdttest