Quellcode durchsuchen

[功能修复]调整应答包

liuf vor 10 Monaten
Ursprung
Commit
8e91ce528c

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

@@ -15,6 +15,29 @@ public class FrameDataSplicing {
 
 
 
+    public static byte[] spliceing(byte[] 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; //其实字节
+        outBuf[index++] = (byte) (length + 4); //字节长度
+        outBuf[index++] = (byte) seq[0];
+        outBuf[index++] = (byte) seq[1];
+        outBuf[index++] = (byte) encryptFlag;
+        outBuf[index++] = (byte) frameType;
+        System.arraycopy(data, 0, outBuf, index, length);
+        index += length;
+        int crc;
+        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));
+        return outBuf;
+    }
+
     /**
      *
      * @param seq  序列号

+ 29 - 4
src/main/java/com/tmzn/devicelinkykc/frameMsg/frameType/CharngingPushFrame.java

@@ -40,7 +40,12 @@ public class CharngingPushFrame {
             String key = redisCache.getCacheMapValue(RedisConstant.YKC_KEY_MAP,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());
+                byte[] spliceing ;
+                if(deviceConnectionMsg.getStartChargeReq()!=null && deviceConnectionMsg.getStartChargeReq().length>0){
+                    spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getStartChargeReq(), DeviceSendYkc.START_CHARNGING_RESPONSE.getFrameType(), DeviceSendYkc.START_CHARNGING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                }else{
+                    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) {
@@ -52,7 +57,12 @@ public class CharngingPushFrame {
         }
 
         try {
-            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.START_CHARNGING_RESPONSE_16.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
+            byte[] spliceing ;
+            if(deviceConnectionMsg.getStartChargeReq()!=null && deviceConnectionMsg.getStartChargeReq().length>0){
+                spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getStartChargeReq(), DeviceSendYkc.START_CHARNGING_RESPONSE_16.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
+            }else{
+                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) {
@@ -105,7 +115,15 @@ public class CharngingPushFrame {
             String key = redisCache.getCacheMapValue(RedisConstant.YKC_KEY_MAP,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());
+
+                byte[] spliceing;
+
+                if(deviceConnectionMsg.getStopChargeReq()!=null && deviceConnectionMsg.getStopChargeReq().length>0){
+                    spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getStopChargeReq(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getFrameType(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
+                }else{
+                    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();
                 deviceConnectionMsg.incrementMessageCount();
@@ -116,7 +134,14 @@ public class CharngingPushFrame {
         }
 
         try {
-            byte[] spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
+
+            byte[] spliceing;
+
+            if(deviceConnectionMsg.getStopChargeReq()!=null && deviceConnectionMsg.getStopChargeReq().length>0){
+                spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getStopChargeReq(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
+            }else{
+                spliceing = FrameDataSplicing.spliceing(deviceConnectionMsg.getMessageCount(), DeviceSendYkc.STOP_CHARNGING_RESPONSE.getFrameType(), 0, params, params.length, deviceConnectionMsg.getIs18());
+            }
             deviceConnectionMsg.getOutputStream().write(spliceing);
             deviceConnectionMsg.getOutputStream().flush();
             deviceConnectionMsg.incrementMessageCount();

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

@@ -21,17 +21,20 @@ import java.util.Date;
 @Component
 @Slf4j
 public class CheckTime {
-    public void checkTimeSend(DeviceConnectionMsg deviceConnectionMsg) {
+
+
+    public void checkTimeSend(DeviceConnectionMsg deviceConnectionMsg,byte[] fromMsgSeq) {
         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, deviceConnectionMsg.getIs18());
+        byte[] pack = FrameDataSplicing.spliceing(fromMsgSeq, DeviceSendYkc.CHECKTIME_RESPONSE.getFrameType(), DeviceSendYkc.CHECKTIME_RESPONSE.getEncryptFlag(), bytes, bytes.length, deviceConnectionMsg.getIs18());
         try {
             deviceConnectionMsg.getOutputStream().write(pack);
             deviceConnectionMsg.getOutputStream().flush();
+            deviceConnectionMsg.incrementMessageCount();
+
         } catch (IOException e) {
             e.printStackTrace();
         }
-        deviceConnectionMsg.incrementMessageCount();
     }
 
     public byte[] charngTime(DeviceConnectionMsg deviceConnection) {

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

@@ -25,7 +25,7 @@ public class RemoteBalanceUpdatePushFrame {
     @Autowired
     private RedisCache redisCache;
 
-    public void updateBalance(DeviceConnectionMsg deviceConnectionMsg,byte[] card,byte reason){
+    public void updateBalance(DeviceConnectionMsg deviceConnectionMsg,byte[] card,byte reason,byte[] fromMsgSeq){
         byte[] encrypt = new byte[0];
         if(deviceConnectionMsg.getIs18()){
             try {
@@ -39,7 +39,7 @@ public class RemoteBalanceUpdatePushFrame {
                 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());
+                byte[] bytes = FrameDataSplicing.spliceing(fromMsgSeq, DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getFrameType(), DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getEncryptFlag(), encrypt, encrypt.length, deviceConnectionMsg.getIs18());
                 try {
                     deviceConnectionMsg.getOutputStream().write(bytes);
                     deviceConnectionMsg.getOutputStream().flush();
@@ -57,7 +57,7 @@ public class RemoteBalanceUpdatePushFrame {
         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());
+            byte[] bytes = FrameDataSplicing.spliceing(fromMsgSeq, DeviceSendYkc.UPDATE_BALANCE_RESPONSE.getFrameType(), 0, send, send.length, deviceConnectionMsg.getIs18());
             try {
                 deviceConnectionMsg.getOutputStream().write(bytes);
                 deviceConnectionMsg.getOutputStream().flush();

+ 13 - 9
src/main/java/com/tmzn/devicelinkykc/message/YkcMsgHandle.java

@@ -122,6 +122,7 @@ public class YkcMsgHandle {
                 //将接收到的消息类型拿到进行判断
                 System.arraycopy(receiveData, 0, response, 0, response.length);
                 String s = Integer.toHexString(response[5] & 0xFF);
+                byte[] fromMsgSeq = {response[2],response[3]};
                 int framType = response[5] & 0xFF;//Integer.parseInt(s);
                 int encry = response[4] & 0xFF;
 
@@ -206,23 +207,23 @@ public class YkcMsgHandle {
 
                 } else if (framType == YkcSendDevice.START_CHARNGING_REQUEST.getFrameType() || framType == YkcSendDevice.START_CHARNGING_REQUEST_16.getFrameType()) {
                     logger.info("↓↓↓↓↓{}运营平台远程控制启机" + framType,deviceConnectionMsg.getDeviceId());
-                    startChargingRequest(deviceConnectionMsg, respone_msg);
+                    startChargingRequest(deviceConnectionMsg, respone_msg,fromMsgSeq);
 
                 } else if (framType == YkcSendDevice.STOP_CHARNGING_REQUEST.getFrameType()) {
                     logger.info("↓↓↓↓↓{}运营平台远程停机",deviceConnectionMsg.getDeviceId());
-                    stopChargingRequest(deviceConnectionMsg, respone_msg);
+                    stopChargingRequest(deviceConnectionMsg, respone_msg,fromMsgSeq);
 
                 } else if (framType == YkcSendDevice.UPDATE_BALANCE.getFrameType()) {
                     logger.info("↓↓↓↓↓{}远程更新余额",deviceConnectionMsg.getDeviceId());
                     try {
-                        remoteBalanceUpdate(deviceConnectionMsg, respone_msg);
+                        remoteBalanceUpdate(deviceConnectionMsg, respone_msg,fromMsgSeq);
                     } catch (Exception e) {
                         e.printStackTrace();
                     }
 
                 } else if (framType == YkcSendDevice.CHECKTIME.getFrameType()) {
                     logger.info("↓↓↓↓↓{}对时设置" + framType,deviceConnectionMsg.getDeviceId());
-                    checkTime.checkTimeSend(deviceConnectionMsg);
+                    checkTime.checkTimeSend(deviceConnectionMsg,fromMsgSeq);
 
                 } else if (framType == YkcSendDevice.BILLING_MODEL_SETTING_SG.getFrameType()) {
                     logger.info("↓↓↓↓↓{}深谷计费模型设置",deviceConnectionMsg.getDeviceId());
@@ -287,12 +288,12 @@ public class YkcMsgHandle {
      * @param deviceConnectionMsg
      * @param respone_msg
      */
-    private void startChargingRequest(DeviceConnectionMsg deviceConnectionMsg, byte[] respone_msg) {
+    private void startChargingRequest(DeviceConnectionMsg deviceConnectionMsg, byte[] respone_msg,byte[] fromMsgSeq) {
 
         try {
             //1.解析出启动充电流水号
             //查询设备sn和imie
-
+            deviceConnectionMsg.setStartChargeReq(fromMsgSeq);
             //切出订单号,保存在连接的该设备中
             byte[] transOrder = Arrays.copyOfRange(respone_msg, 0, 16);
             //测试
@@ -418,7 +419,10 @@ public class YkcMsgHandle {
      * @param deviceConnectionMsg
      * @param respone_msg
      */
-    private void stopChargingRequest(DeviceConnectionMsg deviceConnectionMsg, byte[] respone_msg) {
+    private void stopChargingRequest(DeviceConnectionMsg deviceConnectionMsg, byte[] respone_msg,byte[] fromMsgSeq) {
+
+        deviceConnectionMsg.setStopChargeReq(fromMsgSeq);
+
         byte[] guns = Arrays.copyOfRange(respone_msg, 7, 8);
         //查询设备sn和imie
         QueryWrapper<DeviceStatus> deviceStatusQueryWrapper = new QueryWrapper<>();
@@ -470,7 +474,7 @@ public class YkcMsgHandle {
      * @param deviceConnectionMsg
      * @param respone_msg
      */
-    private void remoteBalanceUpdate(DeviceConnectionMsg deviceConnectionMsg, byte[] respone_msg) throws Exception {
+    private void remoteBalanceUpdate(DeviceConnectionMsg deviceConnectionMsg, byte[] respone_msg,byte[] fromMsgSeq) throws Exception {
         byte[] pileCode = Arrays.copyOfRange(respone_msg, 0, 7);
         byte[] guns = Arrays.copyOfRange(respone_msg, 7, 8);
         byte[] card = Arrays.copyOfRange(respone_msg, 8, 16);
@@ -507,7 +511,7 @@ public class YkcMsgHandle {
 
 
         //这里测试默认更新成功
-        remoteBalanceUpdatePushFrame.updateBalance(deviceConnectionMsg, card, (byte) 0x00);
+        remoteBalanceUpdatePushFrame.updateBalance(deviceConnectionMsg, card, (byte) 0x00,fromMsgSeq);
 
     }
 

+ 18 - 0
src/main/java/com/tmzn/devicelinkykc/socket/DeviceConnectionMsg.java

@@ -26,6 +26,8 @@ public class DeviceConnectionMsg {
     private String ver;
     private long loginTime;
     private boolean loginMsgSend;
+    private byte[] startChargeReq;
+    private byte[] stopChargeReq;
 
     public DeviceConnectionMsg(Socket socket, String deviceId,String imei,String deviceSn,String ver,int isDc) {
         this.heartTime= 0L;
@@ -148,4 +150,20 @@ public class DeviceConnectionMsg {
     public void setLoginMsgSend(){
         this.loginMsgSend = true;
     }
+
+    public byte[] getStartChargeReq() {
+        return startChargeReq;
+    }
+
+    public void setStartChargeReq(byte[] startChargeReq) {
+        this.startChargeReq = startChargeReq;
+    }
+
+    public byte[] getStopChargeReq() {
+        return stopChargeReq;
+    }
+
+    public void setStopChargeReq(byte[] stopChargeReq) {
+        this.stopChargeReq = stopChargeReq;
+    }
 }