ソースを参照

feat(广西ai自助):添加解析类到解析handler,取消加解密便于调试

Zhenghanjv 9 ヶ月 前
コミット
6ea6904b7b

+ 1 - 1
ai-fueling/src/main/java/com/tokheim/aifueling/communication/entitys/Quantitative.java

@@ -18,6 +18,6 @@ public class Quantitative extends BaseInfo implements IDataExtractor {
 
     @Override
     public String getEvent() {
-        return "";
+        return "quantitative";
     }
 }

+ 38 - 5
ai-fueling/src/main/java/com/tokheim/aifueling/communication/toInternalInterface/entity/FuelSendRequest.java

@@ -1,11 +1,28 @@
 package com.tokheim.aifueling.communication.toInternalInterface.entity;
 
-import com.tokheim.aifueling.communication.entitys.BaseInfo;
-import com.tokheim.aifueling.communication.entitys.CardStatus;
+import com.tokheim.aifueling.communication.entitys.*;
 import lombok.Data;
 
 import java.math.BigDecimal;
 
+/**
+ * 定义内部接口请求参数
+ * <h5>Type:指令</h5>
+ * <h5>ClientId:加油机 id,用 ip 填入</h5>
+ * <h5>AIId:AI id</h5>
+ * <h5>GLId:格林 id</h5>
+ * <h5>NozzleNo:枪号</h5>
+ * <h5>OilCode:油品编码</h5>
+ * <h5>Balance:卡余额</h5>
+ * <h5>MaxRefuelingAmount:最大可加金额</h5>
+ * <h5>CardType:卡类型</h5>
+ * <h5>Amount:金额</h5>
+ * <h5>Vol:升数</h5>
+ * <h5>LicensePlateMatching:车牌匹配结果</h5>
+ *      <p>00:不匹配</p>
+ *      <p>01:匹配</p>
+ *      <p>02:不是限车牌卡</p>
+ */
 @Data
 public class FuelSendRequest {
     /**
@@ -64,7 +81,10 @@ public class FuelSendRequest {
     public BigDecimal Vol;
 
     /**
-     * 车牌匹配
+     * 车牌匹配结果
+     * <p>00:不匹配</p>
+     * <p>01:匹配</p>
+     * <p>02:不是限车牌卡</p>
      */
     public Integer LicensePlateMatching;
 
@@ -112,14 +132,27 @@ public class FuelSendRequest {
                 fuelSendRequest.setBalance(new BigDecimal(cardStatus.getBalance()));
                 break;
             case 2:
+                NozzleStatus nozzleStatus = (NozzleStatus) baseInfo;
+                fuelSendRequest.setType(nozzleStatus.getEvent());
+                if(nozzleStatus.getMaxRefuelingAmount() != null) fuelSendRequest.setMaxRefuelingAmount(new BigDecimal(nozzleStatus.getMaxRefuelingAmount()));
+                if(nozzleStatus.getBalance() != null) fuelSendRequest.setBalance(new BigDecimal(nozzleStatus.getBalance()));
+                if(nozzleStatus.getAmount() != null) fuelSendRequest.setAmount(new BigDecimal(nozzleStatus.getAmount()));
+                if(nozzleStatus.getVol() != null) fuelSendRequest.setVol(new BigDecimal(nozzleStatus.getVol()));
                 break;
             case 3:
-                break;
-            case 4:
+                RefuelCode refuelCode = (RefuelCode) baseInfo;
+                fuelSendRequest.setType(refuelCode.getEvent());
+                if (refuelCode.getMaxRefuelingAmount() != null) fuelSendRequest.setAmount(new BigDecimal(refuelCode.getMaxRefuelingAmount()));
+                if (refuelCode.getMaxRefuelingVolume() != null) fuelSendRequest.setVol(new BigDecimal(refuelCode.getMaxRefuelingVolume()));
                 break;
             case 5:
+                Quantitative quantitative = (Quantitative) baseInfo;
+                fuelSendRequest.setType(quantitative.getEvent());
                 break;
             case 6:
+                CarNum carNum = (CarNum) baseInfo;
+                fuelSendRequest.setType(carNum.getEvent());
+                fuelSendRequest.setLicensePlateMatching(carNum.getMatchResult());
                 break;
         }
 

+ 5 - 1
ai-fueling/src/main/java/com/tokheim/aifueling/netty/handler/AnalyzerHandler.java

@@ -1,7 +1,7 @@
 package com.tokheim.aifueling.netty.handler;
 
 import com.tokheim.aifueling.communication.BaseAnalyzer;
-import com.tokheim.aifueling.communication.analyzer.CardStatusAnalyzer;
+import com.tokheim.aifueling.communication.analyzer.*;
 import com.tokheim.aifueling.utils.ByteArrayUtils;
 import com.tokheim.aifueling.utils.SM4Utils;
 import io.netty.channel.ChannelHandler;
@@ -24,6 +24,10 @@ public class AnalyzerHandler extends ChannelInboundHandlerAdapter {
 
     public AnalyzerHandler() {
         eventMap.put((byte) 0x01,new CardStatusAnalyzer());
+        eventMap.put((byte) 0x02,new NozzleStatusAnalyzer());
+        eventMap.put((byte) 0x03,new RefuelCodeAnalyzer());
+        eventMap.put((byte) 0x05,new QuantitativeAnalyzer());
+        eventMap.put((byte) 0x06,new CarNumAnalyzer());
     }
 
     @Override

+ 12 - 5
ai-fueling/src/main/java/com/tokheim/aifueling/utils/ByteArrayUtils.java

@@ -98,22 +98,29 @@ public class ByteArrayUtils {
         }
         String[] decimalSplit = decimalStr.split("\\.");
         String intPart = decimalSplit[0];
-        String decimalPart = "00";
+        StringBuilder decimalPart = new StringBuilder("00");
         if (decimalSplit.length == 2){
-            decimalPart = decimalSplit[1];
+            decimalPart = new StringBuilder(decimalSplit[1]);
         }
 
         if (intPart.length() > 6) {
             log.error("decimalStrToBCD: {} is too big", decimal);
             return zeroBytes;
         }
-        if (decimalPart.length() > 2) decimalPart = decimalPart.substring(0,2);
 
+        if (decimalPart.length() > 2) decimalPart = new StringBuilder(decimalPart.substring(0, 2));
+
+        if (intPart.length() < 6) {
+            int len = 6 - intPart.length();
+            for (int i = 0; i < len - 1; i++) {
+                decimalPart.insert(0, "0");
+            }
+        }
         if (intPart.length() % 2 != 0) intPart = "0" + intPart;
-        if (decimalPart.length() % 2 != 0) decimalPart = "0" + decimalPart;
+        if (decimalPart.length() % 2 != 0) decimalPart.insert(0, "0");
 
         byte[] intPartBytes = Convert.hexToBytes(intPart);
-        byte[] decimalBytes = Convert.hexToBytes(decimalPart);
+        byte[] decimalBytes = Convert.hexToBytes(decimalPart.toString());
 
         return add(intPartBytes,decimalBytes);
     }

+ 32 - 30
ai-fueling/src/main/java/com/tokheim/aifueling/utils/SM4Utils.java

@@ -34,25 +34,26 @@ public class SM4Utils {
      * @throws Exception
      */
     public static byte[] encrypt(byte[] plainText) throws Exception {
-        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
-        // 密钥必须是16字节(128位)
-        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
-
-        // 获取 Cipher 实例,指定算法为 "SM4/ECB/NoPadding"
-        Cipher cipher = Cipher.getInstance(ALGORITHM, PROVIDER);
-
-        // 初始化 Cipher 为加密模式
-        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
-
-        //保证加密明文长度为 16 的倍数
-        int paddingLength = 16 - (plainText.length % 16);
-        if (paddingLength != 16) {
-            byte[] fillBytes = new byte[plainText.length + paddingLength];
-            System.arraycopy(plainText, 0, fillBytes, 0, plainText.length);
-            plainText = fillBytes;
-        }
-        // 执行加密
-        return cipher.doFinal(plainText);
+        return plainText;
+//        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
+//        // 密钥必须是16字节(128位)
+//        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
+//
+//        // 获取 Cipher 实例,指定算法为 "SM4/ECB/NoPadding"
+//        Cipher cipher = Cipher.getInstance(ALGORITHM, PROVIDER);
+//
+//        // 初始化 Cipher 为加密模式
+//        cipher.init(Cipher.ENCRYPT_MODE, keySpec);
+//
+//        //保证加密明文长度为 16 的倍数
+//        int paddingLength = 16 - (plainText.length % 16);
+//        if (paddingLength != 16) {
+//            byte[] fillBytes = new byte[plainText.length + paddingLength];
+//            System.arraycopy(plainText, 0, fillBytes, 0, plainText.length);
+//            plainText = fillBytes;
+//        }
+//        // 执行加密
+//        return cipher.doFinal(plainText);
     }
 
     /**
@@ -62,16 +63,17 @@ public class SM4Utils {
      * @throws Exception
      */
     public static byte[] decrypt(byte[] cipherText) throws Exception {
-        if (cipherText.length % 16 != 0) {
-            log.info("sm4解密,密文长度不为 16 倍数,解密失败\n" + ByteArrayUtils.bytesToHexString(cipherText));
-            return new byte[0];
-        }
-        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
-        // 密钥必须是16字节(128位)
-        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
-
-        Cipher cipher = Cipher.getInstance(ALGORITHM, PROVIDER);
-        cipher.init(Cipher.DECRYPT_MODE, keySpec);
-        return cipher.doFinal(cipherText);
+        return cipherText;
+//        if (cipherText.length % 16 != 0) {
+//            log.info("sm4解密,密文长度不为 16 倍数,解密失败\n" + ByteArrayUtils.bytesToHexString(cipherText));
+//            return new byte[0];
+//        }
+//        byte[] keyBytes = key.getBytes(StandardCharsets.UTF_8);
+//        // 密钥必须是16字节(128位)
+//        SecretKeySpec keySpec = new SecretKeySpec(keyBytes, KEY_ALGORITHM);
+//
+//        Cipher cipher = Cipher.getInstance(ALGORITHM, PROVIDER);
+//        cipher.init(Cipher.DECRYPT_MODE, keySpec);
+//        return cipher.doFinal(cipherText);
     }
 }

+ 1 - 0
ai-fueling/src/main/resources/application-dev.yml

@@ -14,6 +14,7 @@ server:
   servlet:
     # 访问上下文 tms-master
     context-path: /aiFueling
+  address: 0.0.0.0
 
 
 # netty 配置

+ 31 - 0
ai-fueling/src/test/java/com/tokheim/aifueling/AiFuelingApplicationTests.java

@@ -104,6 +104,37 @@ class AiFuelingApplicationTests {
 
         String amount10 = "asdad";
         System.out.println(amount10 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount10)));
+
+        String amount11 = "0";
+        String amount11_ = "0,";
+        String amount12 = "0.00";
+        String amount12_ = "0,.00";
+        String amount13 = "0.000";
+        String amount13_ = "0,.000";
+        System.out.println(amount11 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount11)));
+        System.out.println(amount11_ + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount11_)));
+        System.out.println(amount12 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount12)));
+        System.out.println(amount12_ + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount12_)));
+        System.out.println(amount13 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount13)));
+        System.out.println(amount13_ + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount13_)));
+
+        String amount14 = "01";
+        String amount14_ = "0,1";
+        String amount15 = "0.01";
+        String amount15_ = "0,.01";
+        String amount16 = "0.001";
+        String amount16_ = "0,.001";
+        String amount17 = "0.010";
+        String amount17_ = "0,.010";
+        System.out.println(amount14 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount14)));
+        System.out.println(amount14_ + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount14_)));
+        System.out.println(amount15 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount15)));
+        System.out.println(amount15_ + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount15_)));
+        System.out.println(amount16 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount16)));
+        System.out.println(amount16_ + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount16_)));
+        System.out.println(amount17 + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount17)));
+        System.out.println(amount17_ + "=>" + ByteArrayUtils.bytesToHexString(ByteArrayUtils.decimalStrToBCD(amount17_)));
+
     }
 
     @Test