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

1、设备升级包服务实现mqtt

liweimin преди 1 ден
родител
ревизия
d2f3bd6cdc
променени са 15 файла, в които са добавени 800 реда и са изтрити 1 реда
  1. 143 0
      ruoyi-device/src/main/java/com/ruoyi/device/domain/entity/DeviceUpgradePackage.java
  2. 16 0
      ruoyi-device/src/main/java/com/ruoyi/device/mapper/DeviceUpgradePackageMapper.java
  3. 55 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/decoder/upgrade/GetApkUrlMessage.java
  4. 42 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/decoder/upgrade/QueryApkListMessage.java
  5. 57 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/encoder/upgrade/SendApkListRequest.java
  6. 55 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/encoder/upgrade/SendApkUrlRequest.java
  7. 29 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/enums/DeviceUpgradePackageTypeEnum.java
  8. 45 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/decoder/upgrade/GetApkUrlDecoder.java
  9. 40 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/decoder/upgrade/QueryApkListDecoder.java
  10. 57 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/encoder/upgrade/SendApkListEncoder.java
  11. 54 0
      ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/encoder/upgrade/SendApkUrlEncoder.java
  12. 28 0
      ruoyi-device/src/main/java/com/ruoyi/device/service/IDeviceUpgradePackageService.java
  13. 117 0
      ruoyi-device/src/main/java/com/ruoyi/device/service/impl/DeviceUpgradePackageServiceImpl.java
  14. 41 0
      ruoyi-device/src/main/resources/mapper/device/DeviceUpgradePackageMapper.xml
  15. 21 1
      sql/tsb_3.0.sql

+ 143 - 0
ruoyi-device/src/main/java/com/ruoyi/device/domain/entity/DeviceUpgradePackage.java

@@ -0,0 +1,143 @@
+package com.ruoyi.device.domain.entity;
+
+import com.ruoyi.common.core.domain.BaseEntity;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+/**
+ * 设备升级包 tb_device_upgrade_package
+ *
+ * @author lwm
+ */
+public class DeviceUpgradePackage extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    private Long id;
+
+    /** 设备类型 */
+    private String deviceType;
+
+    /** 软件版本号 */
+    private String appVersion;
+
+    /** 下载地址 */
+    private String downloadUrl;
+
+    /** 状态(0:未启用;1:启用) */
+    private Integer status;
+
+    /** 升级包类型(0:测试升级包;1:正式升级包) */
+    private Integer type;
+
+    /** 固件类型(1:bootloader; 2:产测; 3:app; 4:lua) */
+    private Integer firmwareType;
+
+    /** 删除标志(0代表存在 2代表删除) */
+    private String delFlag;
+
+    public DeviceUpgradePackage()
+    {
+
+    }
+
+    public Long getId()
+    {
+        return id;
+    }
+
+    public void setId(Long id)
+    {
+        this.id = id;
+    }
+
+    public String getDeviceType()
+    {
+        return deviceType;
+    }
+
+    public void setDeviceType(String deviceType)
+    {
+        this.deviceType = deviceType;
+    }
+
+    public String getAppVersion()
+    {
+        return appVersion;
+    }
+
+    public void setAppVersion(String appVersion)
+    {
+        this.appVersion = appVersion;
+    }
+
+    public String getDownloadUrl()
+    {
+        return downloadUrl;
+    }
+
+    public void setDownloadUrl(String downloadUrl)
+    {
+        this.downloadUrl = downloadUrl;
+    }
+
+    public Integer getStatus()
+    {
+        return status;
+    }
+
+    public void setStatus(Integer status)
+    {
+        this.status = status;
+    }
+
+    public Integer getType()
+    {
+        return type;
+    }
+
+    public void setType(Integer type)
+    {
+        this.type = type;
+    }
+
+    public Integer getFirmwareType()
+    {
+        return firmwareType;
+    }
+
+    public void setFirmwareType(Integer firmwareType)
+    {
+        this.firmwareType = firmwareType;
+    }
+
+    public String getDelFlag()
+    {
+        return delFlag;
+    }
+
+    public void setDelFlag(String delFlag)
+    {
+        this.delFlag = delFlag;
+    }
+
+    @Override
+    public String toString()
+    {
+        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("deviceType", getDeviceType())
+            .append("appVersion", getAppVersion())
+            .append("downloadUrl", getDownloadUrl())
+            .append("status", getStatus())
+            .append("type", getType())
+            .append("firmwareType", getFirmwareType())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .append("remark", getRemark())
+            .toString();
+    }
+}

+ 16 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mapper/DeviceUpgradePackageMapper.java

@@ -0,0 +1,16 @@
+package com.ruoyi.device.mapper;
+
+import com.ruoyi.device.domain.entity.DeviceUpgradePackage;
+
+import java.util.List;
+
+/**
+ * 设备升级包数据访问
+ */
+public interface DeviceUpgradePackageMapper
+{
+    /**
+     * 按状态、设备类型、升级包类型、固件类型、版本号 查询升级包列表
+     */
+    List<DeviceUpgradePackage> selectDeviceUpgradePackageList(DeviceUpgradePackage query);
+}

+ 55 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/decoder/upgrade/GetApkUrlMessage.java

@@ -0,0 +1,55 @@
+package com.ruoyi.device.mqtt.domain.decoder.upgrade;
+
+import com.ruoyi.device.mqtt.domain.BaseBody;
+
+/**
+ * 固件 URL 查询上行消息
+ */
+public class GetApkUrlMessage extends BaseBody
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 目标设备型号 */
+    private String targetDeviceType;
+
+    /** 固件类型(1:bootloader; 2:产测; 3:app; 4:lua) */
+    private Integer firmwareType;
+
+    /** 版本号 */
+    private String version;
+
+    public GetApkUrlMessage()
+    {
+        super();
+    }
+
+    public String getTargetDeviceType()
+    {
+        return targetDeviceType;
+    }
+
+    public void setTargetDeviceType(String targetDeviceType)
+    {
+        this.targetDeviceType = targetDeviceType;
+    }
+
+    public Integer getFirmwareType()
+    {
+        return firmwareType;
+    }
+
+    public void setFirmwareType(Integer firmwareType)
+    {
+        this.firmwareType = firmwareType;
+    }
+
+    public String getVersion()
+    {
+        return version;
+    }
+
+    public void setVersion(String version)
+    {
+        this.version = version;
+    }
+}

+ 42 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/decoder/upgrade/QueryApkListMessage.java

@@ -0,0 +1,42 @@
+package com.ruoyi.device.mqtt.domain.decoder.upgrade;
+
+import com.ruoyi.device.mqtt.domain.BaseBody;
+
+/**
+ * 固件版本列表查询上行消息
+ */
+public class QueryApkListMessage extends BaseBody
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 目标设备型号 */
+    private String targetDeviceType;
+
+    /** 固件类型(1:bootloader; 2:产测; 3:app; 4:lua) */
+    private Integer firmwareType;
+
+    public QueryApkListMessage()
+    {
+        super();
+    }
+
+    public String getTargetDeviceType()
+    {
+        return targetDeviceType;
+    }
+
+    public void setTargetDeviceType(String targetDeviceType)
+    {
+        this.targetDeviceType = targetDeviceType;
+    }
+
+    public Integer getFirmwareType()
+    {
+        return firmwareType;
+    }
+
+    public void setFirmwareType(Integer firmwareType)
+    {
+        this.firmwareType = firmwareType;
+    }
+}

+ 57 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/encoder/upgrade/SendApkListRequest.java

@@ -0,0 +1,57 @@
+package com.ruoyi.device.mqtt.domain.encoder.upgrade;
+
+import com.ruoyi.device.mqtt.domain.BaseBody;
+
+import java.util.List;
+
+/**
+ * 固件版本列表下行请求
+ */
+public class SendApkListRequest extends BaseBody
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 目标设备型号 */
+    private String targetDeviceType;
+
+    /** 固件类型 */
+    private Integer firmwareType;
+
+    /** 版本列表 */
+    private List<String> versionList;
+
+    public SendApkListRequest()
+    {
+        super();
+    }
+
+    public String getTargetDeviceType()
+    {
+        return targetDeviceType;
+    }
+
+    public void setTargetDeviceType(String targetDeviceType)
+    {
+        this.targetDeviceType = targetDeviceType;
+    }
+
+    public Integer getFirmwareType()
+    {
+        return firmwareType;
+    }
+
+    public void setFirmwareType(Integer firmwareType)
+    {
+        this.firmwareType = firmwareType;
+    }
+
+    public List<String> getVersionList()
+    {
+        return versionList;
+    }
+
+    public void setVersionList(List<String> versionList)
+    {
+        this.versionList = versionList;
+    }
+}

+ 55 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/domain/encoder/upgrade/SendApkUrlRequest.java

@@ -0,0 +1,55 @@
+package com.ruoyi.device.mqtt.domain.encoder.upgrade;
+
+import com.ruoyi.device.mqtt.domain.BaseBody;
+
+/**
+ * 固件 URL 下行请求
+ */
+public class SendApkUrlRequest extends BaseBody
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 目标设备型号 */
+    private String targetDeviceType;
+
+    /** 固件类型 */
+    private Integer firmwareType;
+
+    /** 下载地址 */
+    private String downloadUrl;
+
+    public SendApkUrlRequest()
+    {
+        super();
+    }
+
+    public String getTargetDeviceType()
+    {
+        return targetDeviceType;
+    }
+
+    public void setTargetDeviceType(String targetDeviceType)
+    {
+        this.targetDeviceType = targetDeviceType;
+    }
+
+    public Integer getFirmwareType()
+    {
+        return firmwareType;
+    }
+
+    public void setFirmwareType(Integer firmwareType)
+    {
+        this.firmwareType = firmwareType;
+    }
+
+    public String getDownloadUrl()
+    {
+        return downloadUrl;
+    }
+
+    public void setDownloadUrl(String downloadUrl)
+    {
+        this.downloadUrl = downloadUrl;
+    }
+}

+ 29 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/enums/DeviceUpgradePackageTypeEnum.java

@@ -0,0 +1,29 @@
+package com.ruoyi.device.mqtt.enums;
+
+/**
+ * 设备升级包类型
+ */
+public enum DeviceUpgradePackageTypeEnum
+{
+    TEST_PACKAGE(0, "测试升级包"),
+    PROD_PACKAGE(1, "正式升级包");
+
+    private final Integer type;
+    private final String message;
+
+    DeviceUpgradePackageTypeEnum(Integer type, String message)
+    {
+        this.type = type;
+        this.message = message;
+    }
+
+    public Integer getType()
+    {
+        return type;
+    }
+
+    public String getMessage()
+    {
+        return message;
+    }
+}

+ 45 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/decoder/upgrade/GetApkUrlDecoder.java

@@ -0,0 +1,45 @@
+package com.ruoyi.device.mqtt.handler.decoder.upgrade;
+
+import com.ruoyi.device.mqtt.annotation.ConsumerHandler;
+import com.ruoyi.device.mqtt.domain.decoder.upgrade.GetApkUrlMessage;
+import com.ruoyi.device.mqtt.enums.MsgTypeEnum;
+import com.ruoyi.device.mqtt.handler.decoder.AbstractDecoder;
+import com.ruoyi.device.mqtt.util.TargetTypeConvertUtil;
+import com.ruoyi.device.mqtt.vo.CommonHeader;
+import com.ruoyi.device.mqtt.vo.CommonTopic;
+import com.ruoyi.device.service.IDeviceUpgradePackageService;
+import io.netty.buffer.ByteBuf;
+import jakarta.annotation.Resource;
+
+/**
+ * 固件 URL 查询上行解码 GET_APK_URL_UP
+ */
+@ConsumerHandler(msgType = MsgTypeEnum.GET_APK_URL_UP)
+public class GetApkUrlDecoder extends AbstractDecoder<Void>
+{
+    @Resource
+    private IDeviceUpgradePackageService deviceUpgradePackageService;
+
+    @Override
+    protected Void decode(CommonTopic topic, CommonHeader header, ByteBuf body)
+    {
+        String deviceType = TargetTypeConvertUtil.convert(body.readUnsignedShortLE());
+        Long deviceSn = body.readUnsignedIntLE();
+        String targetDeviceType = TargetTypeConvertUtil.convert(body.readUnsignedShortLE());
+        int firmwareType = body.readByte();
+        body.readUnsignedIntLE();
+        int length = body.readByte();
+        byte[] content = new byte[length];
+        body.readBytes(content);
+
+        GetApkUrlMessage getApkUrlMessage = new GetApkUrlMessage();
+        getApkUrlMessage.setDeviceSn(deviceSn);
+        getApkUrlMessage.setDeviceType(deviceType);
+        getApkUrlMessage.setTargetDeviceType(targetDeviceType);
+        getApkUrlMessage.setFirmwareType(firmwareType);
+        getApkUrlMessage.setVersion(new String(content));
+
+        deviceUpgradePackageService.handleGetApkUrl(getApkUrlMessage);
+        return null;
+    }
+}

+ 40 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/decoder/upgrade/QueryApkListDecoder.java

@@ -0,0 +1,40 @@
+package com.ruoyi.device.mqtt.handler.decoder.upgrade;
+
+import com.ruoyi.device.mqtt.annotation.ConsumerHandler;
+import com.ruoyi.device.mqtt.domain.decoder.upgrade.QueryApkListMessage;
+import com.ruoyi.device.mqtt.enums.MsgTypeEnum;
+import com.ruoyi.device.mqtt.handler.decoder.AbstractDecoder;
+import com.ruoyi.device.mqtt.util.TargetTypeConvertUtil;
+import com.ruoyi.device.mqtt.vo.CommonHeader;
+import com.ruoyi.device.mqtt.vo.CommonTopic;
+import com.ruoyi.device.service.IDeviceUpgradePackageService;
+import io.netty.buffer.ByteBuf;
+import jakarta.annotation.Resource;
+
+/**
+ * 固件版本列表查询上行解码 GET_APK_UP
+ */
+@ConsumerHandler(msgType = MsgTypeEnum.GET_APK_UP)
+public class QueryApkListDecoder extends AbstractDecoder<Void>
+{
+    @Resource
+    private IDeviceUpgradePackageService deviceUpgradePackageService;
+
+    @Override
+    protected Void decode(CommonTopic topic, CommonHeader header, ByteBuf body)
+    {
+        String deviceType = TargetTypeConvertUtil.convert(body.readUnsignedShortLE());
+        Long deviceSn = body.readUnsignedIntLE();
+        String targetDeviceType = TargetTypeConvertUtil.convert(body.readUnsignedShortLE());
+        int firmwareType = body.readByte();
+
+        QueryApkListMessage queryApkListMessage = new QueryApkListMessage();
+        queryApkListMessage.setDeviceSn(deviceSn);
+        queryApkListMessage.setDeviceType(deviceType);
+        queryApkListMessage.setTargetDeviceType(targetDeviceType);
+        queryApkListMessage.setFirmwareType(firmwareType);
+
+        deviceUpgradePackageService.handleQueryApkList(queryApkListMessage);
+        return null;
+    }
+}

+ 57 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/encoder/upgrade/SendApkListEncoder.java

@@ -0,0 +1,57 @@
+package com.ruoyi.device.mqtt.handler.encoder.upgrade;
+
+import com.ruoyi.device.mqtt.annotation.ProducerHandler;
+import com.ruoyi.device.mqtt.domain.encoder.upgrade.SendApkListRequest;
+import com.ruoyi.device.mqtt.enums.MsgTypeEnum;
+import com.ruoyi.device.mqtt.enums.QosEnum;
+import com.ruoyi.device.mqtt.handler.encoder.AbstractEncoder;
+import io.netty.buffer.ByteBuf;
+import org.springframework.stereotype.Component;
+
+/**
+ * 固件版本列表下行编码 GET_APK_DOWN
+ */
+@Component
+@ProducerHandler(msgType = MsgTypeEnum.GET_APK_DOWN)
+public class SendApkListEncoder extends AbstractEncoder<SendApkListRequest>
+{
+    @Override
+    protected void encode(SendApkListRequest message, ByteBuf body)
+    {
+        setTargetType(message.getDeviceType(), body);
+        body.writeIntLE(message.getDeviceSn().intValue());
+        setTargetType(message.getTargetDeviceType(), body);
+        body.writeByte(message.getFirmwareType());
+        body.writeIntLE(0);
+        body.writeByte(message.getVersionList().size());
+        for (String version : message.getVersionList())
+        {
+            body.writeByte(version.getBytes().length);
+            body.writeBytes(version.getBytes());
+        }
+    }
+
+    @Override
+    protected String topic(SendApkListRequest sendApkListRequest)
+    {
+        return generateTopic(sendApkListRequest);
+    }
+
+    @Override
+    protected MsgTypeEnum msgType()
+    {
+        return MsgTypeEnum.GET_APK_DOWN;
+    }
+
+    @Override
+    protected QosEnum qos()
+    {
+        return QosEnum.QoS2;
+    }
+
+    @Override
+    protected boolean retain()
+    {
+        return false;
+    }
+}

+ 54 - 0
ruoyi-device/src/main/java/com/ruoyi/device/mqtt/handler/encoder/upgrade/SendApkUrlEncoder.java

@@ -0,0 +1,54 @@
+package com.ruoyi.device.mqtt.handler.encoder.upgrade;
+
+import com.ruoyi.device.mqtt.annotation.ProducerHandler;
+import com.ruoyi.device.mqtt.domain.encoder.upgrade.SendApkUrlRequest;
+import com.ruoyi.device.mqtt.enums.MsgTypeEnum;
+import com.ruoyi.device.mqtt.enums.QosEnum;
+import com.ruoyi.device.mqtt.handler.encoder.AbstractEncoder;
+import io.netty.buffer.ByteBuf;
+import org.springframework.stereotype.Component;
+
+/**
+ * 固件 URL 下行编码 GET_APK_URL_DOWN
+ */
+@Component
+@ProducerHandler(msgType = MsgTypeEnum.GET_APK_URL_DOWN)
+public class SendApkUrlEncoder extends AbstractEncoder<SendApkUrlRequest>
+{
+    @Override
+    protected void encode(SendApkUrlRequest message, ByteBuf body)
+    {
+        setTargetType(message.getDeviceType(), body);
+        body.writeIntLE(message.getDeviceSn().intValue());
+        setTargetType(message.getTargetDeviceType(), body);
+        body.writeByte(message.getFirmwareType());
+        body.writeIntLE(0);
+
+        body.writeByte(message.getDownloadUrl().getBytes().length);
+        body.writeBytes(message.getDownloadUrl().getBytes());
+    }
+
+    @Override
+    protected String topic(SendApkUrlRequest sendApkUrlRequest)
+    {
+        return generateTopic(sendApkUrlRequest);
+    }
+
+    @Override
+    protected MsgTypeEnum msgType()
+    {
+        return MsgTypeEnum.GET_APK_URL_DOWN;
+    }
+
+    @Override
+    protected QosEnum qos()
+    {
+        return QosEnum.QoS2;
+    }
+
+    @Override
+    protected boolean retain()
+    {
+        return false;
+    }
+}

+ 28 - 0
ruoyi-device/src/main/java/com/ruoyi/device/service/IDeviceUpgradePackageService.java

@@ -0,0 +1,28 @@
+package com.ruoyi.device.service;
+
+import com.ruoyi.device.domain.entity.DeviceUpgradePackage;
+import com.ruoyi.device.mqtt.domain.decoder.upgrade.GetApkUrlMessage;
+import com.ruoyi.device.mqtt.domain.decoder.upgrade.QueryApkListMessage;
+
+import java.util.List;
+
+/**
+ * 设备升级包服务(查询 tb_device_upgrade_package)
+ */
+public interface IDeviceUpgradePackageService
+{
+    /**
+     * 查询升级包列表
+     */
+    List<DeviceUpgradePackage> selectDeviceUpgradePackageList(DeviceUpgradePackage query);
+
+    /**
+     * 处理 GET_APK_UP:查询版本列表并下发 GET_APK_DOWN
+     */
+    void handleQueryApkList(QueryApkListMessage queryApkListMessage);
+
+    /**
+     * 处理 GET_APK_URL_UP:查询下载地址并下发 GET_APK_URL_DOWN
+     */
+    void handleGetApkUrl(GetApkUrlMessage getApkUrlMessage);
+}

+ 117 - 0
ruoyi-device/src/main/java/com/ruoyi/device/service/impl/DeviceUpgradePackageServiceImpl.java

@@ -0,0 +1,117 @@
+package com.ruoyi.device.service.impl;
+
+import com.ruoyi.device.domain.entity.DeviceUpgradePackage;
+import com.ruoyi.device.mapper.DeviceUpgradePackageMapper;
+import com.ruoyi.device.mqtt.domain.encoder.upgrade.SendApkListRequest;
+import com.ruoyi.device.mqtt.domain.encoder.upgrade.SendApkUrlRequest;
+import com.ruoyi.device.mqtt.domain.decoder.upgrade.GetApkUrlMessage;
+import com.ruoyi.device.mqtt.domain.decoder.upgrade.QueryApkListMessage;
+import com.ruoyi.device.mqtt.enums.DeviceUpgradePackageTypeEnum;
+import com.ruoyi.device.mqtt.enums.MsgTypeEnum;
+import com.ruoyi.device.mqtt.handler.HandlerManager;
+import com.ruoyi.device.mqtt.handler.encoder.IEncoder;
+import com.ruoyi.device.mqtt.util.MsgHandlerUtil;
+import com.ruoyi.device.service.IDeviceUpgradePackageService;
+import jakarta.annotation.Resource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 设备升级包服务实现
+ */
+@Service
+public class DeviceUpgradePackageServiceImpl implements IDeviceUpgradePackageService
+{
+    private static final Logger log = LoggerFactory.getLogger(DeviceUpgradePackageServiceImpl.class);
+
+    @Resource
+    private DeviceUpgradePackageMapper deviceUpgradePackageMapper;
+
+    @Resource
+    private HandlerManager handlerManager;
+
+    @Override
+    public List<DeviceUpgradePackage> selectDeviceUpgradePackageList(DeviceUpgradePackage query)
+    {
+        return deviceUpgradePackageMapper.selectDeviceUpgradePackageList(query);
+    }
+
+    @Override
+    public void handleQueryApkList(QueryApkListMessage queryApkListMessage)
+    {
+        try
+        {
+            log.info("查询固件升级包:{}", queryApkListMessage);
+
+            DeviceUpgradePackage query = new DeviceUpgradePackage();
+            query.setType(DeviceUpgradePackageTypeEnum.PROD_PACKAGE.getType());
+            query.setDeviceType(queryApkListMessage.getTargetDeviceType());
+            query.setFirmwareType(queryApkListMessage.getFirmwareType());
+            List<DeviceUpgradePackage> packageList = selectDeviceUpgradePackageList(query);
+            List<String> versionList = new ArrayList<>();
+            for (DeviceUpgradePackage item : packageList)
+            {
+                versionList.add(item.getAppVersion());
+            }
+
+            SendApkListRequest sendApkListRequest = new SendApkListRequest();
+            sendApkListRequest.setDeviceSn(queryApkListMessage.getDeviceSn());
+            sendApkListRequest.setDeviceType(queryApkListMessage.getDeviceType());
+            sendApkListRequest.setTargetDeviceType(queryApkListMessage.getTargetDeviceType());
+            sendApkListRequest.setFirmwareType(queryApkListMessage.getFirmwareType());
+            sendApkListRequest.setVersionList(versionList);
+
+            encode(MsgTypeEnum.GET_APK_DOWN, sendApkListRequest);
+        }
+        catch (Exception e)
+        {
+            log.error("查询固件升级包处理异常:{}", e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void handleGetApkUrl(GetApkUrlMessage getApkUrlMessage)
+    {
+        try
+        {
+            log.info("获取固件升级包地址:{}", getApkUrlMessage);
+
+            DeviceUpgradePackage query = new DeviceUpgradePackage();
+            query.setType(DeviceUpgradePackageTypeEnum.PROD_PACKAGE.getType());
+            query.setDeviceType(getApkUrlMessage.getTargetDeviceType());
+            query.setFirmwareType(getApkUrlMessage.getFirmwareType());
+            query.setAppVersion(getApkUrlMessage.getVersion());
+            List<DeviceUpgradePackage> packageList = selectDeviceUpgradePackageList(query);
+            if (packageList.isEmpty())
+            {
+                log.info("未找到匹配的固件升级包:{}", getApkUrlMessage);
+                return;
+            }
+
+            SendApkUrlRequest sendApkUrlRequest = new SendApkUrlRequest();
+            sendApkUrlRequest.setDeviceSn(getApkUrlMessage.getDeviceSn());
+            sendApkUrlRequest.setDeviceType(getApkUrlMessage.getDeviceType());
+            sendApkUrlRequest.setTargetDeviceType(getApkUrlMessage.getTargetDeviceType());
+            sendApkUrlRequest.setFirmwareType(getApkUrlMessage.getFirmwareType());
+            sendApkUrlRequest.setDownloadUrl(packageList.get(0).getDownloadUrl());
+
+            encode(MsgTypeEnum.GET_APK_URL_DOWN, sendApkUrlRequest);
+        }
+        catch (Exception e)
+        {
+            log.error("获取固件升级包地址处理异常:{}", e.getMessage(), e);
+        }
+    }
+
+    @SuppressWarnings("unchecked")
+    private <T> void encode(MsgTypeEnum msgType, T request)
+    {
+        String key = MsgHandlerUtil.getEncoderKey(msgType);
+        IEncoder<T> encoder = (IEncoder<T>) handlerManager.getEncoder(key);
+        encoder.encode(request);
+    }
+}

+ 41 - 0
ruoyi-device/src/main/resources/mapper/device/DeviceUpgradePackageMapper.xml

@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.device.mapper.DeviceUpgradePackageMapper">
+
+    <resultMap id="DeviceUpgradePackageResult" type="com.ruoyi.device.domain.entity.DeviceUpgradePackage">
+        <id property="id" column="id"/>
+        <result property="deviceType" column="device_type"/>
+        <result property="appVersion" column="app_version"/>
+        <result property="downloadUrl" column="download_url"/>
+        <result property="status" column="status"/>
+        <result property="type" column="type"/>
+        <result property="firmwareType" column="firmware_type"/>
+        <result property="remark" column="remark"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+    </resultMap>
+
+    <select id="selectDeviceUpgradePackageList" parameterType="com.ruoyi.device.domain.entity.DeviceUpgradePackage"
+            resultMap="DeviceUpgradePackageResult">
+        select id, device_type, app_version, download_url, status, type, firmware_type, remark, create_time, update_time
+        from tb_device_upgrade_package
+        where del_flag = '0'
+        <if test="status != null">
+            and status = #{status}
+        </if>
+        <if test="deviceType != null and deviceType != ''">
+            and device_type = #{deviceType}
+        </if>
+        <if test="type != null">
+            and type = #{type}
+        </if>
+        <if test="firmwareType != null">
+            and firmware_type = #{firmwareType}
+        </if>
+        <if test="appVersion != null and appVersion != ''">
+            and app_version = #{appVersion}
+        </if>
+        order by create_time desc, id desc
+    </select>
+
+</mapper>

+ 21 - 1
sql/tsb_3.0.sql

@@ -152,6 +152,26 @@ INSERT INTO sys_role_menu VALUES ('2', '3604');
 INSERT INTO sys_role_menu VALUES ('2', '3605');
 
 
-
+-- ----------------------------
+-- 设备升级包表(固件 GET_APK_UP 查询)
+-- ----------------------------
+DROP TABLE IF EXISTS tb_device_upgrade_package;
+CREATE TABLE tb_device_upgrade_package (
+  id              bigint(20)      NOT NULL AUTO_INCREMENT    COMMENT '主键',
+  device_type     varchar(32)     NULL                       COMMENT '设备类型',
+  app_version     varchar(32)     NULL                       COMMENT '软件版本号',
+  download_url    varchar(255)    NULL                       COMMENT '下载地址',
+  status          tinyint(1)      DEFAULT 1                  COMMENT '状态(0:未启用;1:启用)',
+  type            tinyint(1)      DEFAULT 1                  COMMENT '升级包类型(0:测试;1:正式)',
+  firmware_type   tinyint(1)      DEFAULT 3                  COMMENT '固件类型(1:bootloader;2:产测;3:app;4:lua)',
+  remark          varchar(500)    DEFAULT NULL               COMMENT '备注',
+  create_by       varchar(64)     DEFAULT ''                 COMMENT '创建者',
+  create_time     datetime                                   COMMENT '创建时间',
+  update_by       varchar(64)     DEFAULT ''                 COMMENT '更新者',
+  update_time     datetime                                   COMMENT '更新时间',
+  del_flag        char(1)         DEFAULT '0'                COMMENT '删除标志(0代表存在 2代表删除)',
+  PRIMARY KEY (id),
+  KEY idx_model_firmware_type (device_type, firmware_type, type, status, del_flag)
+) COMMENT='设备升级包表';