Преглед на файлове

feat: 【SM4数据加密】 Netty长连接+HTTP接口与设备数据交互数据加密

lihao16 преди 2 седмици
родител
ревизия
c9c682d337
променени са 22 файла, в които са добавени 732 реда и са изтрити 56 реда
  1. 11 0
      smsb-common/smsb-common-encrypt/pom.xml
  2. 27 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/BaseMessageHandler.java
  3. 24 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/DecryptBaseHandler.java
  4. 66 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/DecryptHandlerFactory.java
  5. 57 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/EncryptAndDecryptHandlerConfiguration.java
  6. 22 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/EncryptBaseHandler.java
  7. 61 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/EncryptHandlerFactory.java
  8. 16 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/MessageHandlerBuilder.java
  9. 83 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/MessageHandlerPool.java
  10. 84 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/Sm4DecryptHandler.java
  11. 83 0
      smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/Sm4EncryptHandler.java
  12. 5 0
      smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/bo/HttpHeartbeatReq.java
  13. 34 15
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/controller/DeviceController.java
  14. 11 6
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/AuthServerHandler.java
  15. 6 1
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/ConnectServerHandler.java
  16. 4 2
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/HeartServerHandler.java
  17. 5 1
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/SourcePlayRecordHandler.java
  18. 8 2
      smsb-modules/smsb-netty/src/main/java/com/inspur/netty/stream/service/impl/StreamServiceImpl.java
  19. 11 0
      smsb-modules/smsb-source/pom.xml
  20. 101 27
      smsb-modules/smsb-source/src/main/java/com/inspur/source/controller/SmsbFrontController.java
  21. 8 1
      smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemPushDeviceServiceImpl.java
  22. 5 1
      smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemPushServiceImpl.java

+ 11 - 0
smsb-common/smsb-common-encrypt/pom.xml

@@ -38,6 +38,17 @@
             <artifactId>spring-webmvc</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-pool2</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>javax.xml.bind</groupId>
+            <artifactId>jaxb-api</artifactId>
+            <version>2.3.1</version>
+        </dependency>
+
         <dependency>
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-spring-boot3-starter</artifactId>

+ 27 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/BaseMessageHandler.java

@@ -0,0 +1,27 @@
+package org.dromara.common.sm4;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * @author linwenhua
+ * @date 2023-01-16 09:08
+ **/
+public interface BaseMessageHandler {
+
+    /**
+     * handle message
+     * @param messageBytes bytes of message
+     * @return message decrypted or encrypted String
+     * @throws IllegalBlockSizeException exception
+     * @throws UnsupportedEncodingException exception
+     * @throws BadPaddingException exception
+     */
+    byte[] handle(byte[] messageBytes) throws IllegalBlockSizeException, UnsupportedEncodingException, BadPaddingException;
+
+    /**
+     * destroy handler
+     */
+    void destroy();
+}

+ 24 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/DecryptBaseHandler.java

@@ -0,0 +1,24 @@
+package org.dromara.common.sm4;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+import java.io.UnsupportedEncodingException;
+
+/**
+ * decrypt message handler
+ * @author linwenhua
+ * @date 2023-01-13 10:39
+ **/
+public interface DecryptBaseHandler extends BaseMessageHandler {
+
+    /**
+     * decrypt message
+     * @param encryptedBytes message
+     * @return decrypted message
+     * @throws IllegalBlockSizeException exception
+     * @throws BadPaddingException exception
+     * @throws UnsupportedEncodingException exception
+     */
+    byte[] decrypt(byte[] encryptedBytes) throws IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException;
+
+}

+ 66 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/DecryptHandlerFactory.java

@@ -0,0 +1,66 @@
+package org.dromara.common.sm4;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.PooledObjectFactory;
+import org.apache.commons.pool2.impl.DefaultPooledObject;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import java.nio.charset.StandardCharsets;
+import java.security.Security;
+
+/**
+ * decrypt message handler factory
+ * @author linwenhua
+ * @date 2023-01-13 10:43
+ **/
+@Slf4j
+public class DecryptHandlerFactory implements PooledObjectFactory<BaseMessageHandler> {
+
+
+    private static final String DEFAULT_KEY = "fELIMxLsdoSgRZnX";
+
+    private static final int KEY_LENGTH = 16;
+    /**
+     * key for decrypt and encrypt
+     */
+    private final byte[] keyBytes;
+
+    public DecryptHandlerFactory(String keyString) {
+        this.keyBytes = keyString.getBytes(StandardCharsets.UTF_8);
+        if (keyBytes.length != KEY_LENGTH) {
+            throw new RuntimeException("400 length of key bytes must be 16");
+        }
+        Security.addProvider(new BouncyCastleProvider());
+    }
+
+    @Override
+    public void activateObject(PooledObject<BaseMessageHandler> p) {
+        log.debug("activate handler");
+    }
+
+    @Override
+    public void destroyObject(PooledObject<BaseMessageHandler> p) {
+        log.info("destroy handler");
+        BaseMessageHandler handler = p.getObject();
+        handler.destroy();
+    }
+
+    @Override
+    public PooledObject<BaseMessageHandler> makeObject() {
+        log.info("build decrypt handler");
+        DecryptBaseHandler decryptBaseHandler = MessageHandlerBuilder.buildDecryptHandler(keyBytes);
+        return new DefaultPooledObject<>(decryptBaseHandler);
+    }
+
+    @Override
+    public void passivateObject(PooledObject<BaseMessageHandler> p) throws Exception {
+        log.debug("passivate handler");
+    }
+
+    @Override
+    public boolean validateObject(PooledObject<BaseMessageHandler> p) {
+        log.debug("validate handler");
+        return true;
+    }
+}

+ 57 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/EncryptAndDecryptHandlerConfiguration.java

@@ -0,0 +1,57 @@
+package org.dromara.common.sm4;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.security.Security;
+import java.time.Duration;
+
+/**
+ * @author linwenhua
+ * @date 2023-01-13 11:28
+ **/
+@Slf4j
+@Component
+public class EncryptAndDecryptHandlerConfiguration {
+
+    private static final String KEY = "fELIMxLsdoSgRZnX";
+
+    @Bean
+    public MessageHandlerPool initCommonPool() {
+        return new MessageHandlerPool(initDecryptHandlerPool(), initEncryptHandlerPool());
+    }
+
+    private GenericObjectPool<BaseMessageHandler> initEncryptHandlerPool() {
+        Security.addProvider(new BouncyCastleProvider());
+        EncryptHandlerFactory encryptHandlerFactory = new EncryptHandlerFactory(KEY);
+
+        GenericObjectPoolConfig<BaseMessageHandler> encryptFactoryConfig = new GenericObjectPoolConfig<>();
+        encryptFactoryConfig.setMaxIdle(3);
+        encryptFactoryConfig.setMaxTotal(5);
+        encryptFactoryConfig.setMinIdle(2);
+        encryptFactoryConfig.setTimeBetweenEvictionRuns(Duration.ofSeconds(15));
+        encryptFactoryConfig.setBlockWhenExhausted(true);
+        encryptFactoryConfig.setMaxWait(Duration.ofSeconds(5));
+        return new GenericObjectPool<>(encryptHandlerFactory, encryptFactoryConfig);
+    }
+
+    private GenericObjectPool<BaseMessageHandler> initDecryptHandlerPool() {
+        Security.addProvider(new BouncyCastleProvider());
+        DecryptHandlerFactory decryptHandlerFactory = new DecryptHandlerFactory(KEY);
+
+        GenericObjectPoolConfig<BaseMessageHandler> decryptFactoryConfig = new GenericObjectPoolConfig<>();
+        decryptFactoryConfig.setMaxIdle(2);
+        decryptFactoryConfig.setMaxTotal(3);
+        decryptFactoryConfig.setMinIdle(1);
+        decryptFactoryConfig.setTimeBetweenEvictionRuns(Duration.ofSeconds(15));
+        decryptFactoryConfig.setBlockWhenExhausted(true);
+        decryptFactoryConfig.setMaxWait(Duration.ofSeconds(5));
+        return new GenericObjectPool<>(decryptHandlerFactory, decryptFactoryConfig);
+    }
+
+
+}

+ 22 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/EncryptBaseHandler.java

@@ -0,0 +1,22 @@
+package org.dromara.common.sm4;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.IllegalBlockSizeException;
+
+/**
+ * encrypt message handler
+ * @author linwenhua
+ * @date 2023-01-13 10:40
+ **/
+public interface EncryptBaseHandler extends BaseMessageHandler {
+
+    /**
+     * encrypt message
+     * @param messageBytes message
+     * @return encrypted message
+     * @throws IllegalBlockSizeException exception
+     * @throws BadPaddingException exception
+     */
+    byte[] encrypt(byte[] messageBytes) throws IllegalBlockSizeException, BadPaddingException;
+
+}

+ 61 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/EncryptHandlerFactory.java

@@ -0,0 +1,61 @@
+package org.dromara.common.sm4;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.PooledObject;
+import org.apache.commons.pool2.PooledObjectFactory;
+import org.apache.commons.pool2.impl.DefaultPooledObject;
+
+import java.nio.charset.StandardCharsets;
+
+/**
+ * encrypt message handler factory
+ * @author linwenhua
+ * @date 2023-01-13 10:43
+ **/
+@Slf4j
+public class EncryptHandlerFactory implements PooledObjectFactory<BaseMessageHandler> {
+
+    private static final int KEY_LENGTH = 16;
+    /**
+     * key for decrypt and encrypt
+     */
+    private final byte[] keyBytes;
+
+    public EncryptHandlerFactory(String keyString) {
+        log.info("init encrypt handler factory");
+        this.keyBytes = keyString.getBytes(StandardCharsets.UTF_8);
+        if (keyBytes.length != KEY_LENGTH) {
+            throw new RuntimeException("400 length of key bytes must be 16");
+        }
+    }
+
+    @Override
+    public void activateObject(PooledObject<BaseMessageHandler> p) {
+        log.debug("activate handler");
+    }
+
+    @Override
+    public void destroyObject(PooledObject<BaseMessageHandler> p) {
+        log.info("destroy handler");
+        BaseMessageHandler encryptBaseHandler = p.getObject();
+        encryptBaseHandler.destroy();
+    }
+
+    @Override
+    public PooledObject<BaseMessageHandler> makeObject() {
+        log.info("build encrypt handler");
+        EncryptBaseHandler encryptBaseHandler = MessageHandlerBuilder.buildEncryptHandler(keyBytes);
+        return new DefaultPooledObject<>(encryptBaseHandler);
+    }
+
+    @Override
+    public void passivateObject(PooledObject<BaseMessageHandler> p) {
+        log.debug("passivate handler");
+    }
+
+    @Override
+    public boolean validateObject(PooledObject<BaseMessageHandler> p) {
+        log.debug("validate handler");
+        return true;
+    }
+}

+ 16 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/MessageHandlerBuilder.java

@@ -0,0 +1,16 @@
+package org.dromara.common.sm4;
+
+/**
+ * @author linwenhua
+ * @date 2023-01-13 10:59
+ **/
+public class MessageHandlerBuilder {
+
+    public static DecryptBaseHandler buildDecryptHandler(byte[] keyBytes) {
+        return new Sm4DecryptHandler(keyBytes);
+    }
+
+    public static EncryptBaseHandler buildEncryptHandler(byte[] keyBytes) {
+        return new Sm4EncryptHandler(keyBytes);
+    }
+}

+ 83 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/MessageHandlerPool.java

@@ -0,0 +1,83 @@
+package org.dromara.common.sm4;
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.pool2.impl.GenericObjectPool;
+
+import javax.xml.bind.DatatypeConverter;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * encrypt and decrypt message handler pool
+ *
+ * @author linwenhua
+ * @date 2023-01-13 15:51
+ **/
+@Slf4j
+public class MessageHandlerPool {
+
+    private final GenericObjectPool<BaseMessageHandler> decryptHandlerPool;
+
+    private final GenericObjectPool<BaseMessageHandler> encryptHandlerPool;
+
+    public MessageHandlerPool(GenericObjectPool<BaseMessageHandler> decryptHandlerPool, GenericObjectPool<BaseMessageHandler> encryptHandlerPool) {
+        this.decryptHandlerPool = decryptHandlerPool;
+        this.encryptHandlerPool = encryptHandlerPool;
+    }
+
+    /*public String decryptMessage(byte[] payload) {
+        BaseMessageHandler handler = null;
+        try {
+            handler = decryptHandlerPool.borrowObject();
+            // decrypt and convert to String
+            return new String(handler.handle(payload), StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            log.error("decrypt message fail: {}", e.getMessage(), e);
+            log.error("original message: {}", payload);
+            throw new RuntimeException("500 decrypt message fail");
+        } finally {
+            if (handler != null) {
+                decryptHandlerPool.returnObject(handler);
+            }
+        }
+    }*/
+
+    public String decryptMessage(String hexEncryptedData) {
+        BaseMessageHandler handler = null;
+        try {
+            handler = decryptHandlerPool.borrowObject();
+            // 将十六进制字符串转换为字节数组再解密
+            byte[] encryptedBytes = DatatypeConverter.parseHexBinary(hexEncryptedData);
+            return new String(handler.handle(encryptedBytes), StandardCharsets.UTF_8);
+        } catch (Exception e) {
+            log.error("decrypt hex message fail: {}", e.getMessage(), e);
+            log.error("original message: {}", hexEncryptedData);
+            throw new RuntimeException("500 decrypt message fail");
+        } finally {
+            if (handler != null) {
+                decryptHandlerPool.returnObject(handler);
+            }
+        }
+    }
+
+
+    public String encryptMessage(String message) {
+        BaseMessageHandler handler = null;
+        try {
+            handler = encryptHandlerPool.borrowObject();
+            // encrypt and convert to hex binary String
+            return DatatypeConverter.printHexBinary(handler.handle(message.getBytes(StandardCharsets.UTF_8)));
+        } catch (Exception e) {
+            log.error("encrypt message fail: {}", e.getMessage(), e);
+            log.error("original message: {}", message);
+            throw new RuntimeException("500 encrypt message fail");
+        } finally {
+            if (handler != null) {
+                encryptHandlerPool.returnObject(handler);
+            }
+        }
+    }
+
+    public int listObjectSize() {
+        return this.encryptHandlerPool.listAllObjects().size();
+    }
+}

+ 84 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/Sm4DecryptHandler.java

@@ -0,0 +1,84 @@
+package org.dromara.common.sm4;
+
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import java.io.UnsupportedEncodingException;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.util.UUID;
+
+/**
+ * @author linwenhua
+ * @date 2022-12-14 09:21
+ **/
+@Slf4j
+public class Sm4DecryptHandler implements DecryptBaseHandler {
+
+    public static final String ALGORITHM_NAME = "SM4";
+    public static final String ALGORITHM_NAME_CBC_PADDING = "SM4/ECB/PKCS5Padding";
+
+    private final byte[] keyBytes;
+    private final String uuid;
+
+    private Cipher cipher;
+
+    public Sm4DecryptHandler(byte[] keyBytes) {
+        //获取 cipher
+        this.keyBytes = keyBytes;
+        this.uuid = UUID.randomUUID().toString();
+        try {
+            initCipher(keyBytes);
+        } catch (Exception e) {
+            log.error("Cipher 初始化出错: {}", e.getMessage(), e);
+            throw new RuntimeException("400 decrypt handler init fail");
+        }
+    }
+
+    private void initCipher(byte[] keyBytes) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException {
+        Key sm4Key = new SecretKeySpec(keyBytes, ALGORITHM_NAME);
+        //加密 Cipher
+        this.cipher = Cipher.getInstance(ALGORITHM_NAME_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);
+        this.cipher.init(Cipher.DECRYPT_MODE, sm4Key);
+    }
+
+    private void initCipher() {
+        try {
+            initCipher(keyBytes);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException | NoSuchProviderException | InvalidKeyException e) {
+            log.error("Cipher 初始化出错: {}", e.getMessage(), e);
+            throw new RuntimeException("400 Cipher init fail");
+        }
+    }
+
+    /**
+     * sm4解密 解密模式:采用ECB
+     *
+     * @param encryptedBytes 16进制的加密字节数组(忽略大小写)
+     * @return 解密后的字符串
+     * @throws IllegalBlockSizeException,BadPaddingException,UnsupportedEncodingException 异常
+     */
+    @Override
+    public byte[] decrypt(byte[] encryptedBytes) throws IllegalBlockSizeException, BadPaddingException {
+        log.debug("decrypt handler: {}", uuid);
+        // 解密
+        return cipher.doFinal(encryptedBytes);
+    }
+
+    @Override
+    public byte[] handle(byte[] messageBytes) throws IllegalBlockSizeException, BadPaddingException {
+        return this.decrypt(messageBytes);
+    }
+
+    @Override
+    public void destroy() {
+        this.cipher = null;
+    }
+}

+ 83 - 0
smsb-common/smsb-common-encrypt/src/main/java/org/dromara/common/sm4/Sm4EncryptHandler.java

@@ -0,0 +1,83 @@
+package org.dromara.common.sm4;
+
+import lombok.extern.slf4j.Slf4j;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.IllegalBlockSizeException;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.util.UUID;
+
+/**
+ * @author linwenhua
+ * @date 2022-12-14 09:20
+ **/
+@Slf4j
+public class Sm4EncryptHandler implements EncryptBaseHandler {
+
+    public static final String ALGORITHM_NAME = "SM4";
+    public static final String ALGORITHM_NAME_CBC_PADDING = "SM4/ECB/PKCS5Padding";
+
+    private final byte[] keyBytes;
+    private final String uuid;
+
+    private Cipher protectCipher;
+
+    public Sm4EncryptHandler(byte[] keyBytes) {
+        //获取 cipher
+        this.keyBytes = keyBytes;
+        this.uuid = UUID.randomUUID().toString();
+        try {
+            initCipher(keyBytes);
+        } catch (Exception e) {
+            log.error("Cipher 初始化出错: {}", e.getMessage(), e);
+            throw new RuntimeException("400 Cipher init fail");
+        }
+    }
+
+    private void initCipher(byte[] keyBytes) throws NoSuchPaddingException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeyException {
+        Key sm4Key = new SecretKeySpec(keyBytes, ALGORITHM_NAME);
+        //加密 Cipher
+        protectCipher = Cipher.getInstance(ALGORITHM_NAME_CBC_PADDING, BouncyCastleProvider.PROVIDER_NAME);
+        protectCipher.init(Cipher.ENCRYPT_MODE, sm4Key);
+    }
+
+    private void initCipher() {
+        try {
+            initCipher(keyBytes);
+        } catch (NoSuchPaddingException | NoSuchAlgorithmException | NoSuchProviderException | InvalidKeyException e) {
+            log.error("Cipher 初始化出错: {}", e.getMessage(), e);
+            throw new RuntimeException("400 Cipher init fail");
+        }
+    }
+
+
+    /**
+     * sm4加密字节数组 加密模式: ECB
+     *
+     * @param messageBytes 待加密字节数组
+     * @return 返回16进制的加密字符串
+     * @throws IllegalBlockSizeException,BadPaddingException 异常
+     */
+    @Override
+    public byte[] encrypt(byte[] messageBytes) throws IllegalBlockSizeException, BadPaddingException {
+        log.debug("encrypt handler: {}", uuid);
+        return protectCipher.doFinal(messageBytes);
+    }
+
+    @Override
+    public byte[] handle(byte[] messageBytes) throws IllegalBlockSizeException, BadPaddingException {
+        return this.encrypt(messageBytes);
+    }
+
+    @Override
+    public void destroy() {
+        this.protectCipher = null;
+    }
+}

+ 5 - 0
smsb-modules/smsb-device/src/main/java/com/inspur/device/domain/bo/HttpHeartbeatReq.java

@@ -67,5 +67,10 @@ public class HttpHeartbeatReq {
     /** 音量 */
     private Integer volume;
 
+    /**
+     * 加密请求内容
+     */
+    private String data;
+
 
 }

+ 34 - 15
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/controller/DeviceController.java

@@ -19,6 +19,7 @@ import org.dromara.common.idempotent.annotation.RepeatSubmit;
 import org.dromara.common.log.annotation.Log;
 import org.dromara.common.log.enums.BusinessType;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.sm4.MessageHandlerPool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -46,6 +47,9 @@ public class DeviceController {
     @Autowired
     private ISmsbDeviceLogPushService smsbDeviceLogPushService;
 
+    @Autowired
+    private MessageHandlerPool decryptAndEncryptHandlerPool;
+
     /**
      * 重启设备
      *
@@ -63,7 +67,8 @@ public class DeviceController {
         String taskParam = PushMessageType.CONTROL_REBOOT.getValue();
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_REBOOT, deviceVo, taskParam);
         // 3 组装重启命令 发送长连接
-        String rebootCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_REBOOT.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String rebootCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_REBOOT.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), rebootCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }
@@ -85,7 +90,8 @@ public class DeviceController {
         String taskParam = PushMessageType.CONTROL_RESTART_APP.getValue();
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_RESTART_APP, deviceVo, taskParam);
         // 3 组装重启命令
-        String startCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_RESTART_APP.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String startCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_RESTART_APP.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), startCmd);
         return isSend ? R.ok() : R.fail("发送失败,设备长连接已断开");
     }
@@ -107,7 +113,8 @@ public class DeviceController {
         String taskParam = PushMessageType.CONTROL_SHUTDOWN.getValue();
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_SHUTDOWN, deviceVo, taskParam);
         // 3 组装关机命令 发送长连接
-        String shutdownCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_SHUTDOWN.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String shutdownCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_SHUTDOWN.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), shutdownCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }
@@ -130,7 +137,8 @@ public class DeviceController {
         String taskParam = PushMessageType.CONTROL_STANDBY.getValue() + "/" + action;
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_STANDBY, deviceVo, taskParam);
         // 3 组装待机命令 发送长连接
-        String standbyCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_STANDBY.getValue() + "/" + action + NettyConstants.DATA_PACK_SEPARATOR;
+        String standbyCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_STANDBY.getValue() + "/" + action)
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), standbyCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }
@@ -155,7 +163,8 @@ public class DeviceController {
         String taskParam = scheduleCron.toString();
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_POWER_SCHEDULE, deviceVo, taskParam);
         // 4 组装待机命令 发送长连接
-        String standbyCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_MULTI_CARD_SCHEDULE.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String standbyCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_MULTI_CARD_SCHEDULE.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), standbyCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }
@@ -178,7 +187,8 @@ public class DeviceController {
         String taskParam = PushMessageType.CONTROL_VOLUME.getValue() + "/" + volumeValue;
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_VOICE, deviceVo, taskParam);
         // 3 组装待机命令 发送长连接
-        String standbyCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_VOLUME.getValue() + "/" + volumeValue + NettyConstants.DATA_PACK_SEPARATOR;
+        String standbyCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_VOLUME.getValue() + "/" + volumeValue)
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), standbyCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }
@@ -201,7 +211,8 @@ public class DeviceController {
         String taskParam = PushMessageType.CONTROL_BRIGHTNESS.getValue() + "/" + handleBrightness;
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_BRIGHTNESS, deviceVo, taskParam);
         // 3 组装待机命令 发送长连接
-        String standbyCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_BRIGHTNESS.getValue() + "/" + handleBrightness + NettyConstants.DATA_PACK_SEPARATOR;
+        String standbyCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_BRIGHTNESS.getValue() + "/" + handleBrightness)
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), standbyCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }
@@ -227,11 +238,13 @@ public class DeviceController {
         if (DeviceConstants.DEVICE_POWER_ON.equals(type)) {
             taskParam = createPowerSetParam(deviceVo,type);
             taskType = DeviceTaskConstants.DEVICE_TASK_POWER_ON;
-            powerSetCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_POWER_ON.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+            powerSetCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_POWER_ON.getValue())
+                + NettyConstants.DATA_PACK_SEPARATOR;
         }else {
             taskParam = createPowerSetParam(deviceVo,type);
             taskType = DeviceTaskConstants.DEVICE_TASK_POWER_OFF;
-            powerSetCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_POWER_OFF.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+            powerSetCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_POWER_OFF.getValue())
+                + NettyConstants.DATA_PACK_SEPARATOR;
         }
         deviceTaskService.createNewDeviceTask(taskType, deviceVo, taskParam);
         // 3 组装待机命令 发送长连接
@@ -296,7 +309,8 @@ public class DeviceController {
         // String redisValue = LoginHelper.getUserId().toString();
         // RedisUtils.setCacheObject(redisKey, redisValue, Duration.ofMinutes(10));
         // 4 组装截屏命令
-        String screenshotCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_SCREENSHOT.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String screenshotCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_SCREENSHOT.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), screenshotCmd);
         return isSend ? R.ok() : R.fail("发送失败,设备长连接已断开");
 
@@ -320,7 +334,8 @@ public class DeviceController {
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_PLAY_NEXT, deviceVo, taskParam);
 
         // 3 组装长连接命令
-        String screenshotCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_PLAY_NEXT.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String screenshotCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_PLAY_NEXT.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), screenshotCmd);
         return isSend ? R.ok() : R.fail("发送失败,设备长连接已断开");
 
@@ -344,7 +359,8 @@ public class DeviceController {
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_PLAY_LAST, deviceVo, taskParam);
 
         // 3 组装长连接命令
-        String screenshotCmd = deviceVo.getIdentifier() + PushMessageType.CONTROL_PLAY_LAST.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String screenshotCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.CONTROL_PLAY_LAST.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), screenshotCmd);
         return isSend ? R.ok() : R.fail("发送失败,设备长连接已断开");
 
@@ -369,7 +385,8 @@ public class DeviceController {
                     String taskParam = PushMessageType.DEVICE_CHECK_OTA.getValue();
                     deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_OTA, deviceVo, taskParam);
                     // 发送升级命令
-                    String upgradeCmd = deviceVo.getIdentifier() + PushMessageType.DEVICE_CHECK_OTA.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+                    String upgradeCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.DEVICE_CHECK_OTA.getValue())
+                        + NettyConstants.DATA_PACK_SEPARATOR;
                     boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), upgradeCmd);
                     log.info("发送设备 :{} 升级指令 : {}", deviceId, isSend);
                 }
@@ -399,7 +416,8 @@ public class DeviceController {
         SmsbDeviceVo deviceVo = smsbDeviceService.getDeviceCacheById(bo.getDeviceId());
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_LOG_PUSH_START, deviceVo, taskParam);
         // 3 组装日志抓取命令 发送长连接
-        String logPushCmd = deviceVo.getIdentifier() + PushMessageType.DEVICE_LOG_PUSH_START.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String logPushCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.DEVICE_LOG_PUSH_START.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), logPushCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }
@@ -424,7 +442,8 @@ public class DeviceController {
         String taskParam = PushMessageType.DEVICE_LOG_PUSH_END.getValue();
         deviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_LOG_PUSH_END, deviceVo, taskParam);
         // 3 组装日志抓取命令 发送长连接
-        String logPushCmd = deviceVo.getIdentifier() + PushMessageType.DEVICE_LOG_PUSH_END.getValue() + NettyConstants.DATA_PACK_SEPARATOR;
+        String logPushCmd = decryptAndEncryptHandlerPool.encryptMessage(deviceVo.getIdentifier() + PushMessageType.DEVICE_LOG_PUSH_END.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean isSend = PushMsgUtil.sendV2(deviceVo.getIdentifier(), logPushCmd);
         return isSend ? R.ok() : R.fail("长连接发送失败,设备长连接已断开");
     }

+ 11 - 6
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/AuthServerHandler.java

@@ -12,6 +12,7 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.sm4.MessageHandlerPool;
 
 import java.nio.charset.Charset;
 
@@ -25,6 +26,8 @@ public class AuthServerHandler extends ChannelInboundHandlerAdapter {
 
     private static final ISmsbDeviceService smsbDeviceService = SpringUtils.getBean(ISmsbDeviceService.class);
 
+    private static final MessageHandlerPool decryptAndEncryptHandlerPool = SpringUtils.getBean(MessageHandlerPool.class);
+
     /**
      * 当客户端连接服务器完成就会触发该方法
      */
@@ -49,22 +52,24 @@ public class AuthServerHandler extends ChannelInboundHandlerAdapter {
             log.warn("AuthServerHandler: 从 channelId = {} 收到解码后的空消息", ctx.channel().id());
             return;
         }
-        log.info("AuthServerHandler: 接收到客户端的完整消息: {}", message);
-
+        // 数据解密
+        String decryptMessage = decryptAndEncryptHandlerPool.decryptMessage(message);
+        log.info("AuthServerHandler: 接收到客户端的完整消息: {}", decryptMessage);
         // 获取消息中的SN 256数据
-        String identifier = message.split("/")[0];
+        String identifier = decryptMessage.split("/")[0];
         if (StringUtils.isEmpty(identifier)) {
-            log.warn("AuthServerHandler: 无法从消息 {} 中解析出设备标识", message);
+            log.warn("AuthServerHandler: 无法从消息 {} 中解析出设备标识", decryptMessage);
             // 消息格式不正确,关闭连接
             ctx.close();
             return;
         }
         if (validateDevice(identifier)) {
-            ctx.fireChannelRead(message);
+            ctx.fireChannelRead(decryptMessage);
         } else {
             // 发送消息鉴权失败
             String replayMsg = identifier + PushMessageType.INIT_REPLAY.getValue() + "/fail:auth fail";
-            ByteBuf byteBuf = Unpooled.copiedBuffer(replayMsg + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
+            String encryptReplayMsg = decryptAndEncryptHandlerPool.encryptMessage(replayMsg);
+            ByteBuf byteBuf = Unpooled.copiedBuffer(encryptReplayMsg + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
             Channel channel = ctx.channel();
             channel.writeAndFlush(byteBuf);
             ctx.close();

+ 6 - 1
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/ConnectServerHandler.java

@@ -20,6 +20,7 @@ import io.netty.channel.ChannelInboundHandlerAdapter;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
+import org.dromara.common.sm4.MessageHandlerPool;
 
 import java.nio.charset.Charset;
 import java.util.Date;
@@ -58,6 +59,8 @@ public class ConnectServerHandler extends ChannelInboundHandlerAdapter {
      */
     private static final ISmsbDeviceService smsbDeviceService = SpringUtils.getBean(SmsbDeviceServiceImpl.class);
 
+    private static final MessageHandlerPool decryptAndEncryptHandlerPool = SpringUtils.getBean(MessageHandlerPool.class);
+
     @Override
     public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
         String message = (String) msg;
@@ -83,7 +86,9 @@ public class ConnectServerHandler extends ChannelInboundHandlerAdapter {
             updateDeviceOnlineStatue(identifier, NettyConstants.DEVICE_ONLINE_STATUS);
             // 发生init成功消息
             String initSuccessMsg = identifier + PushMessageType.INIT_REPLAY.getValue() + "/success";
-            ByteBuf byteBuf = Unpooled.copiedBuffer(initSuccessMsg + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
+            // 消息加密
+            String encryptMessage = decryptAndEncryptHandlerPool.encryptMessage(initSuccessMsg);
+            ByteBuf byteBuf = Unpooled.copiedBuffer(encryptMessage + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
             ctx.channel().writeAndFlush(byteBuf);
         } else {
             ctx.fireChannelRead(message);

+ 4 - 2
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/HeartServerHandler.java

@@ -21,6 +21,7 @@ import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.sm4.MessageHandlerPool;
 import org.dromara.easyes.common.property.EasyEsProperties;
 
 import java.nio.charset.Charset;
@@ -44,7 +45,7 @@ public class HeartServerHandler extends ChannelInboundHandlerAdapter {
     private static final EsSmsbDeviceHeartRecordMapper esSmsbDeviceHeartRecordMapper = SpringUtils.containsBean("esSmsbDeviceHeartRecordMapper")
         ? SpringUtils.getBean(EsSmsbDeviceHeartRecordMapper.class) : null;
 
-
+    private static final MessageHandlerPool decryptAndEncryptHandlerPool = SpringUtils.getBean(MessageHandlerPool.class);
     @Override
     public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
         if (evt instanceof IdleStateEvent) {
@@ -87,7 +88,8 @@ public class HeartServerHandler extends ChannelInboundHandlerAdapter {
                 }
             }
             String heartbeatReplay = identifier + PushMessageType.HEARTBEAT_REPLAY.getValue();
-            ByteBuf byteBuf = Unpooled.copiedBuffer(heartbeatReplay + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
+            String encryptHeart = decryptAndEncryptHandlerPool.encryptMessage(heartbeatReplay);
+            ByteBuf byteBuf = Unpooled.copiedBuffer(encryptHeart + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
             ctx.channel().writeAndFlush(byteBuf);
             log.debug("HeartServerHandler: 心跳消息已返回 : " + ctx.channel().id() + "identifier = " + identifier);
             Long lastNettyHeartTime = RedisUtils.getCacheObject(NettyConstants.DEVICE_LAST_HEART_PREFIX + identifier);

+ 5 - 1
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/handler/SourcePlayRecordHandler.java

@@ -20,6 +20,7 @@ import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.utils.DateUtils;
 import org.dromara.common.core.utils.SpringUtils;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.sm4.MessageHandlerPool;
 import org.dromara.easyes.common.property.EasyEsProperties;
 
 import java.nio.charset.Charset;
@@ -40,6 +41,8 @@ public class SourcePlayRecordHandler extends ChannelInboundHandlerAdapter {
 
     private static final String REDIS_KEY_MINIO_DATA = "global:msr:minio:id";
 
+    private static final MessageHandlerPool decryptAndEncryptHandlerPool = SpringUtils.getBean(MessageHandlerPool.class);
+
     /**
      * easy-es 配置类
      */
@@ -100,7 +103,8 @@ public class SourcePlayRecordHandler extends ChannelInboundHandlerAdapter {
             sourcePlayRecordMapper.insert(sourcePlayRecord);
             // 回复消息
             String playRecordReplay = identifier + PushMessageType.SOURCE_PLAY_RECORD_REPLAY.getValue();
-            ByteBuf byteBuf = Unpooled.copiedBuffer(playRecordReplay + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
+            String encryptMsg = decryptAndEncryptHandlerPool.encryptMessage(playRecordReplay);
+            ByteBuf byteBuf = Unpooled.copiedBuffer(encryptMsg + NettyConstants.DATA_PACK_SEPARATOR, Charset.forName("utf-8"));
             ctx.channel().writeAndFlush(byteBuf);
         } else {
             ctx.fireChannelRead(message);

+ 8 - 2
smsb-modules/smsb-netty/src/main/java/com/inspur/netty/stream/service/impl/StreamServiceImpl.java

@@ -14,6 +14,7 @@ import com.inspur.netty.util.PushMsgUtil;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.utils.StringUtils;
 import org.dromara.common.redis.utils.RedisUtils;
+import org.dromara.common.sm4.MessageHandlerPool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -46,6 +47,9 @@ public class StreamServiceImpl implements IStreamService {
 
     private static final String app = "live";
 
+    @Autowired
+    private MessageHandlerPool decryptAndEncryptHandlerPool;
+
     @Autowired
     private ISmsbDeviceService smsbDeviceService;
 
@@ -66,7 +70,8 @@ public class StreamServiceImpl implements IStreamService {
         String taskParam = PushMessageType.CONTROL_START_STREAM.getValue();
         smsbDeviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_STREAM_START, smsbDeviceVo, taskParam);
         // 5 发送netty消息,通知设备开始推流
-        String nettyMessage = PushMessageType.CONTROL_START_STREAM.getValue() + "|" + streamUrl + NettyConstants.DATA_PACK_SEPARATOR;
+        String nettyMessage = decryptAndEncryptHandlerPool.encryptMessage(PushMessageType.CONTROL_START_STREAM.getValue() + "|" + streamUrl)
+            + NettyConstants.DATA_PACK_SEPARATOR;
         boolean pushResult = PushMsgUtil.sendV2(smsbDeviceVo.getIdentifier(), nettyMessage);
         // resultVo.setPushResult(pushResult);
         resultVo.setPushResult(true);
@@ -112,7 +117,8 @@ public class StreamServiceImpl implements IStreamService {
     public void stopView(Long deviceId) {
         // 1 根据设备ID查询设备信息
         SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
-        String nettyMessage = PushMessageType.CONTROL_STOP_STREAM.getValue();
+        String nettyMessage = decryptAndEncryptHandlerPool.encryptMessage(PushMessageType.CONTROL_STOP_STREAM.getValue())
+            + NettyConstants.DATA_PACK_SEPARATOR;
         // String streamUrl = schema + "://" + zlmIp + ":1935/" + app + "/" + smsbDeviceVo.getIdentifier();
         String taskParam = PushMessageType.CONTROL_STOP_STREAM.getValue();
         smsbDeviceTaskService.createNewDeviceTask(DeviceTaskConstants.DEVICE_TASK_STREAM_STOP, smsbDeviceVo, taskParam);

+ 11 - 0
smsb-modules/smsb-source/pom.xml

@@ -141,6 +141,17 @@
             <artifactId>spring-test</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>5.2.3</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 101 - 27
smsb-modules/smsb-source/src/main/java/com/inspur/source/controller/SmsbFrontController.java

@@ -7,7 +7,6 @@ import com.inspur.device.domain.constants.DeviceTaskConstants;
 import com.inspur.device.domain.vo.*;
 import com.inspur.device.mapper.SmsbDeviceTaskMapper;
 import com.inspur.device.service.*;
-import com.inspur.device.domain.vo.AgentAuthRes;
 import com.inspur.source.domain.vo.FrontItemSourceVO;
 import com.inspur.source.domain.vo.FrontPushInfoVo;
 import com.inspur.source.service.ISmsbItemPushDeviceService;
@@ -15,11 +14,14 @@ import com.inspur.source.service.ISmsbItemPushService;
 import jakarta.validation.constraints.NotNull;
 import lombok.RequiredArgsConstructor;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.json.utils.JsonUtils;
+import org.dromara.common.sm4.MessageHandlerPool;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import java.nio.charset.StandardCharsets;
 import java.util.List;
 
 /**
@@ -53,6 +55,9 @@ public class SmsbFrontController {
     @Autowired
     private ISmsbDeviceLogPushService smsbDeviceLogPushService;
 
+    @Autowired
+    private MessageHandlerPool decryptAndEncryptHandlerPool;
+
     /**
      * 根据设备identifier 获取该设备最新内容下发记录
      *
@@ -60,14 +65,26 @@ public class SmsbFrontController {
      */
     @SaIgnore
     @GetMapping("/push/{identifier}")
-    public R<List<FrontPushInfoVo>> getItemPushInfo(@NotNull(message = "identifier不能为空") @PathVariable String identifier) {
-        return smsbItemPushService.getItemPushInfo(identifier);
+    public R<String> getItemPushInfo(@NotNull(message = "identifier不能为空") @PathVariable String identifier) {
+        String decryptIdentifier = decryptAndEncryptHandlerPool.decryptMessage(identifier);
+        R<List<FrontPushInfoVo>> response = smsbItemPushService.getItemPushInfo(decryptIdentifier);
+        if (R.isSuccess(response) && null != response.getData()) {
+            String decryptData = decryptAndEncryptHandlerPool.encryptMessage(JsonUtils.toJsonString(response.getData()));
+            return R.ok("SUCCESS", decryptData);
+        }
+        return R.ok();
     }
 
     @SaIgnore
     @GetMapping("/itemSource/{itemId}")
-    public R<List<FrontItemSourceVO>> getItemSourceList(@NotNull(message = "itemId不能为空") @PathVariable Long itemId) {
-        return smsbItemPushService.getItemSourceList(itemId);
+    public R<String> getItemSourceList(@NotNull(message = "itemId不能为空") @PathVariable String itemId) {
+        String decryptItemId = decryptAndEncryptHandlerPool.decryptMessage(itemId);
+        R<List<FrontItemSourceVO>> response = smsbItemPushService.getItemSourceList(Long.parseLong(decryptItemId));
+        if (R.isSuccess(response) && null != response.getData()) {
+            String decryptData = decryptAndEncryptHandlerPool.encryptMessage(JsonUtils.toJsonString(response.getData()));
+            return R.ok("SUCCESS", decryptData);
+        }
+        return R.ok();
     }
 
 
@@ -80,8 +97,10 @@ public class SmsbFrontController {
     @SaIgnore
     @GetMapping("/push/update/end/{identifier}/{pushId}")
     public R<Void> itemUpdateEnd(@NotNull(message = "identifier不能为空") @PathVariable String identifier,
-                                 @NotNull(message = "pushId不能为空") @PathVariable Long pushId) {
-        return smsbItemPushService.itemUpdateEnd(identifier,pushId);
+                                 @NotNull(message = "pushId不能为空") @PathVariable String pushId) {
+        String decryptIdentifier = decryptAndEncryptHandlerPool.decryptMessage(identifier);
+        String decryptPushId = decryptAndEncryptHandlerPool.decryptMessage(pushId);
+        return smsbItemPushService.itemUpdateEnd(decryptIdentifier,Long.parseLong(decryptPushId));
     }
 
 
@@ -92,8 +111,14 @@ public class SmsbFrontController {
      */
     @SaIgnore
     @GetMapping("/ota/check/{identifier}")
-    public R<SmsbOtaRecordVo> deviceCheckOta(@NotNull(message = "identifier不能为空") @PathVariable String identifier) {
-        return iSmsbOtaRecordService.deviceCheckOta(identifier);
+    public R<String> deviceCheckOta(@NotNull(message = "identifier不能为空") @PathVariable String identifier) {
+        String decryptIdentifier = decryptAndEncryptHandlerPool.decryptMessage(identifier);
+        R<SmsbOtaRecordVo> response = iSmsbOtaRecordService.deviceCheckOta(decryptIdentifier);
+        if (R.isSuccess(response) && null != response.getData()) {
+            String decryptData = decryptAndEncryptHandlerPool.encryptMessage(JsonUtils.toJsonString(response.getData()));
+            return R.ok("SUCCESS", decryptData);
+        }
+        return R.ok();
     }
 
     /**
@@ -103,9 +128,11 @@ public class SmsbFrontController {
      */
     @SaIgnore
     @PostMapping("/screenshot/upload")
-    public R<Void> screenshotUpload(@RequestParam("identifier") String identifier,@RequestParam("timestamp") Long timestamp,
+    public R<Void> screenshotUpload(@RequestParam("identifier") String identifier,@RequestParam("timestamp") String timestamp,
                                                @RequestBody MultipartFile file) {
-        return smsbDeviceService.screenshotUpload(identifier,timestamp, file);
+        String decryptIdentifier = decryptAndEncryptHandlerPool.decryptMessage(identifier);
+        String decryptTimestamp = decryptAndEncryptHandlerPool.decryptMessage(timestamp);
+        return smsbDeviceService.screenshotUpload(decryptIdentifier,Long.parseLong(decryptTimestamp), file);
     }
 
     /**
@@ -115,8 +142,17 @@ public class SmsbFrontController {
      */
     @SaIgnore
     @PostMapping("/heartbeat")
-    public R<HttpHeartbeatRspVo> heartbeat(@RequestBody HttpHeartbeatReq requestParam) {
-        return smsbDeviceService.heartbeat(requestParam);
+    public R<String> heartbeat(@RequestBody HttpHeartbeatReq requestParam) {
+        // 获取解密后内容
+        String decryptMessage = decryptAndEncryptHandlerPool.decryptMessage(requestParam.getData());
+        // 将字符串转成json
+        HttpHeartbeatReq decryptedRequest = JsonUtils.parseObject(decryptMessage, HttpHeartbeatReq.class);
+        R<HttpHeartbeatRspVo> response = smsbDeviceService.heartbeat(decryptedRequest);
+        if (null == response.getData()) {
+            String rspEncryptMessage = decryptAndEncryptHandlerPool.encryptMessage(JsonUtils.toJsonString(response.getData()));
+            return R.ok("SUCCESS", rspEncryptMessage);
+        }
+        return R.ok();
     }
 
 
@@ -128,7 +164,16 @@ public class SmsbFrontController {
     @SaIgnore
     @PostMapping("/login")
     public R<String> deviceLogin(@RequestBody HttpHeartbeatReq requestParam) {
-        return smsbDeviceLoginService.deviceLogin(requestParam);
+        // 获取解密后内容
+        String decryptMessage = decryptAndEncryptHandlerPool.decryptMessage(requestParam.getData());
+        // 将字符串转成json
+        HttpHeartbeatReq decryptedRequest = JsonUtils.parseObject(decryptMessage, HttpHeartbeatReq.class);
+        R<String> response = smsbDeviceLoginService.deviceLogin(decryptedRequest);
+        if (response.getCode() == R.SUCCESS) {
+            String rspEncryptMessage = decryptAndEncryptHandlerPool.encryptMessage(response.getData());
+            return R.ok("SUCCESS", rspEncryptMessage);
+        }
+        return response;
     }
 
     /**
@@ -139,7 +184,16 @@ public class SmsbFrontController {
     @SaIgnore
     @PostMapping("/auth")
     public R<String> deviceAuth(@RequestBody HttpHeartbeatReq requestParam) {
-        return smsbDeviceAuthService.deviceAuth(requestParam);
+        // 获取解密后内容
+        String decryptMessage = decryptAndEncryptHandlerPool.decryptMessage(requestParam.getData());
+        // 将字符串转成json
+        HttpHeartbeatReq decryptedRequest = JsonUtils.parseObject(decryptMessage, HttpHeartbeatReq.class);
+        R<String> response = smsbDeviceAuthService.deviceAuth(decryptedRequest);
+        if (response.getCode() == R.SUCCESS) {
+            String rspEncryptMessage = decryptAndEncryptHandlerPool.encryptMessage(response.getMsg());
+            return R.ok("SUCCESS", rspEncryptMessage);
+        }
+        return response;
     }
 
     /**
@@ -161,8 +215,15 @@ public class SmsbFrontController {
      */
     @SaIgnore
     @GetMapping("/task")
-    public R<SmsbDeviceTaskVo> getDeviceTask(@RequestParam("identifier") String identifier,@RequestParam("taskType") Integer taskType) {
-        return smsbDeviceTaskService.getDeviceTask(identifier,taskType);
+    public R<String> getDeviceTask(@RequestParam("identifier") String identifier,@RequestParam("taskType") String taskType) {
+        String decryptIdentifier = decryptAndEncryptHandlerPool.decryptMessage(identifier);
+        String decryptTaskType = decryptAndEncryptHandlerPool.decryptMessage(taskType);
+        R<SmsbDeviceTaskVo> response = smsbDeviceTaskService.getDeviceTask(decryptIdentifier,Integer.parseInt(decryptTaskType));
+        if (R.isSuccess(response) && null != response.getData()) {
+            String decryptData = decryptAndEncryptHandlerPool.encryptMessage(JsonUtils.toJsonString(response.getData()));
+            return R.ok("SUCCESS", decryptData);
+        }
+        return R.ok();
     }
 
     /**
@@ -173,18 +234,20 @@ public class SmsbFrontController {
      */
     @SaIgnore
     @GetMapping("/task/status")
-    public R<Void> uploadTaskStatus(@RequestParam("taskId") Long taskId,@RequestParam("taskStatus") Integer taskStatus) {
-        SmsbDeviceTask smsbDeviceTask = smsbDeviceTaskMapper.selectById(taskId);
+    public R<Void> uploadTaskStatus(@RequestParam("taskId") String taskId,@RequestParam("taskStatus") String taskStatus) {
+        Long decryptTaskId = Long.parseLong(decryptAndEncryptHandlerPool.decryptMessage(taskId));
+        Integer decryptTaskStatus = Integer.parseInt(decryptAndEncryptHandlerPool.decryptMessage(taskStatus));
+        SmsbDeviceTask smsbDeviceTask = smsbDeviceTaskMapper.selectById(decryptTaskId);
         // 如果是任务完成且为时间线更新任务
-        if (taskStatus.equals(DeviceTaskConstants.DEVICE_TASK_STATUS_END)
+        if (decryptTaskStatus.equals(DeviceTaskConstants.DEVICE_TASK_STATUS_END)
             && smsbDeviceTask.getTaskType().equals(DeviceTaskConstants.DEVICE_TASK_PLAY_LINE_UPDATE)) {
             smsbItemPushDeviceService.updateDevicePushStatus(3,smsbDeviceTask);
         }
         // 任务类型为OTA升级
         if (smsbDeviceTask.getTaskType().equals(DeviceTaskConstants.DEVICE_TASK_OTA)) {
-            iSmsbOtaRecordService.updateOtaStatus(smsbDeviceTask,taskStatus);
+            iSmsbOtaRecordService.updateOtaStatus(smsbDeviceTask,decryptTaskStatus);
         }
-        return smsbDeviceTaskService.uploadTaskStatus(taskId,taskStatus,smsbDeviceTask);
+        return smsbDeviceTaskService.uploadTaskStatus(decryptTaskId,decryptTaskStatus,smsbDeviceTask);
     }
 
     /**
@@ -195,7 +258,11 @@ public class SmsbFrontController {
     @SaIgnore
     @PostMapping("/multiCard")
     public R<Void> uploadTaskStatus(@RequestBody FrontMultiCardUploadVo frontMultiCardUploadVo) {
-        return smsbDeviceService.uploadMultiCard(frontMultiCardUploadVo);
+        // 获取解密后内容
+        String decryptMessage = decryptAndEncryptHandlerPool.decryptMessage(frontMultiCardUploadVo.getData());
+        // 将字符串转成json
+        FrontMultiCardUploadVo multiCardUploadVo = JsonUtils.parseObject(decryptMessage, FrontMultiCardUploadVo.class);
+        return smsbDeviceService.uploadMultiCard(multiCardUploadVo);
     }
 
     /**
@@ -205,8 +272,14 @@ public class SmsbFrontController {
      */
     @SaIgnore
     @PostMapping("/chat/config/{identifier}")
-    public R<SmsbDeviceChatKeyVo> getChatConfig(@PathVariable("identifier")String identifier) {
-        return smsbDeviceChatKeyService.getChatConfig(identifier);
+    public R<String> getChatConfig(@PathVariable("identifier")String identifier) {
+        String decryptIdentifier = decryptAndEncryptHandlerPool.decryptMessage(identifier);
+        R<SmsbDeviceChatKeyVo> response = smsbDeviceChatKeyService.getChatConfig(decryptIdentifier);
+        if (R.isSuccess(response) && null != response.getData()) {
+            String decryptData = decryptAndEncryptHandlerPool.encryptMessage(JsonUtils.toJsonString(response.getData()));
+            return R.ok("SUCCESS", decryptData);
+        }
+        return R.ok();
     }
 
     /**
@@ -222,7 +295,7 @@ public class SmsbFrontController {
     }
 
     /**
-     * 前端设备人流量上报
+     * 前端设备 日志抓取上报
      *
      * @param identifier
      * @param file
@@ -230,7 +303,8 @@ public class SmsbFrontController {
     @SaIgnore
     @PostMapping("/deviceLog/upload")
     public R<Void> deviceLogUpload(@RequestParam("identifier") String identifier,@RequestBody MultipartFile file) {
-        return smsbDeviceLogPushService.deviceLogUpload(identifier,file);
+        String decryptIdentifier = decryptAndEncryptHandlerPool.decryptMessage(identifier);
+        return smsbDeviceLogPushService.deviceLogUpload(decryptIdentifier,file);
     }
 
 }

+ 8 - 1
smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemPushDeviceServiceImpl.java

@@ -9,6 +9,7 @@ import com.inspur.device.domain.constants.ResultCodeEnum;
 import com.inspur.device.domain.vo.SmsbDeviceVo;
 import com.inspur.device.service.ISmsbDeviceService;
 import com.inspur.netty.message.push.PushMessageType;
+import com.inspur.netty.util.NettyConstants;
 import com.inspur.netty.util.PushMsgUtil;
 import com.inspur.source.domain.SmsbItemPush;
 import com.inspur.source.domain.SmsbItemPushPlaylist;
@@ -22,6 +23,8 @@ import com.inspur.source.service.ISmsbItemPushDeviceService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.dromara.common.core.domain.R;
+import org.dromara.common.sm4.MessageHandlerPool;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.*;
@@ -46,6 +49,9 @@ public class SmsbItemPushDeviceServiceImpl implements ISmsbItemPushDeviceService
 
     private final SmsbItemPushPlaylineMapper smsbItemPushPlaylineMapper;
 
+    @Autowired
+    private MessageHandlerPool decryptAndEncryptHandlerPool;
+
     /**
      * 查询内容发布设备
      *
@@ -205,7 +211,8 @@ public class SmsbItemPushDeviceServiceImpl implements ISmsbItemPushDeviceService
                 return;
             }
             String identifier = deviceVo.getIdentifier();
-            String nettyMessage = PushMessageType.CONTENT_REMOVE.getValue() + "/" + pushId;
+            String nettyMessage = decryptAndEncryptHandlerPool.encryptMessage(PushMessageType.CONTENT_REMOVE.getValue() + "/" + pushId)
+                + NettyConstants.DATA_PACK_SEPARATOR;
             boolean pushResult = PushMsgUtil.sendV2(identifier, nettyMessage);
             log.info("push content remove identifier: {}, result:{}", identifier, pushResult);
         }

+ 5 - 1
smsb-modules/smsb-source/src/main/java/com/inspur/source/service/impl/SmsbItemPushServiceImpl.java

@@ -21,6 +21,7 @@ import com.inspur.device.mapper.SmsbDeviceMapper;
 import com.inspur.device.mapper.SmsbDeviceTaskMapper;
 import com.inspur.device.service.ISmsbDeviceService;
 import com.inspur.netty.message.push.PushMessageType;
+import com.inspur.netty.util.NettyConstants;
 import com.inspur.netty.util.PushMsgUtil;
 import com.inspur.source.domain.*;
 import com.inspur.source.domain.bo.SmsbItemPushBo;
@@ -45,6 +46,7 @@ import org.dromara.common.mybatis.core.page.PageQuery;
 import org.dromara.common.mybatis.core.page.TableDataInfo;
 import org.dromara.common.redis.utils.RedisUtils;
 import org.dromara.common.satoken.utils.LoginHelper;
+import org.dromara.common.sm4.MessageHandlerPool;
 import org.dromara.workflow.common.constant.FlowConstant;
 import org.dromara.workflow.common.enums.MessageTypeEnum;
 import org.dromara.workflow.common.enums.TaskStatusEnum;
@@ -119,6 +121,8 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
     private ManagementService managementService;
     @Autowired
     private IWfTaskBackNodeService wfTaskBackNodeService;
+    @Autowired
+    private MessageHandlerPool decryptAndEncryptHandlerPool;
 
     /**
      * 查询内容发布
@@ -586,7 +590,7 @@ public class SmsbItemPushServiceImpl implements ISmsbItemPushService {
         }
         for (Long deviceId : deviceIds) {
             // 发送长连接消息
-            String nettyMessage = PushMessageType.CONTENT_UPDATE.getValue();
+            String nettyMessage = decryptAndEncryptHandlerPool.encryptMessage(PushMessageType.CONTENT_UPDATE.getValue()) + NettyConstants.DATA_PACK_SEPARATOR;
             SmsbDeviceVo smsbDeviceVo = smsbDeviceService.getDeviceCacheById(deviceId);
             boolean pushResult = PushMsgUtil.sendV2(smsbDeviceVo.getIdentifier(), nettyMessage);
             log.info("push content update identifier: {}, result:{}", smsbDeviceVo.getIdentifier(), pushResult);