diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/OtaService.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/OtaService.java index 0f50a582..cd35f6ae 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/OtaService.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/OtaService.java @@ -17,4 +17,6 @@ public interface OtaService extends BaseService { void update(OtaEntity entity); void delete(String[] ids); + + OtaEntity getLatestOta(String type); } \ No newline at end of file diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java index 2006791b..5e6928ef 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/DeviceServiceImpl.java @@ -6,11 +6,12 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.TimeZone; -import java.util.concurrent.TimeUnit; +import java.util.UUID; import org.apache.commons.lang3.StringUtils; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -18,10 +19,14 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import cn.hutool.core.util.RandomUtil; +import jakarta.servlet.http.HttpServletRequest; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import xiaozhi.common.constant.Constant; import xiaozhi.common.exception.RenException; import xiaozhi.common.page.PageData; +import xiaozhi.common.redis.RedisKeys; +import xiaozhi.common.redis.RedisUtils; import xiaozhi.common.service.impl.BaseServiceImpl; import xiaozhi.common.user.UserDetail; import xiaozhi.common.utils.ConvertUtils; @@ -31,7 +36,9 @@ import xiaozhi.modules.device.dto.DevicePageUserDTO; import xiaozhi.modules.device.dto.DeviceReportReqDTO; import xiaozhi.modules.device.dto.DeviceReportRespDTO; import xiaozhi.modules.device.entity.DeviceEntity; +import xiaozhi.modules.device.entity.OtaEntity; import xiaozhi.modules.device.service.DeviceService; +import xiaozhi.modules.device.service.OtaService; import xiaozhi.modules.device.vo.UserShowDeviceListVO; import xiaozhi.modules.security.user.SecurityUser; import xiaozhi.modules.sys.service.SysParamsService; @@ -39,25 +46,14 @@ import xiaozhi.modules.sys.service.SysUserUtilService; @Slf4j @Service +@AllArgsConstructor public class DeviceServiceImpl extends BaseServiceImpl implements DeviceService { private final DeviceDao deviceDao; - private final SysUserUtilService sysUserUtilService; - - private final RedisTemplate redisTemplate; - private final SysParamsService sysParamsService; - - // 添加构造函数来初始化 deviceMapper - public DeviceServiceImpl(DeviceDao deviceDao, SysUserUtilService sysUserUtilService, - SysParamsService sysParamsService, - RedisTemplate redisTemplate) { - this.deviceDao = deviceDao; - this.sysUserUtilService = sysUserUtilService; - this.redisTemplate = redisTemplate; - this.sysParamsService = sysParamsService; - } + private final RedisUtils redisUtils; + private final OtaService otaService; @Override public DeviceEntity getDeviceById(String deviceId) { @@ -72,14 +68,14 @@ public class DeviceServiceImpl extends BaseServiceImpl throw new RenException("激活码不能为空"); } String deviceKey = "ota:activation:code:" + activationCode; - Object cacheDeviceId = redisTemplate.opsForValue().get(deviceKey); + Object cacheDeviceId = redisUtils.get(deviceKey); if (cacheDeviceId == null) { throw new RenException("激活码错误"); } String deviceId = (String) cacheDeviceId; String safeDeviceId = deviceId.replace(":", "_").toLowerCase(); String cacheDeviceKey = String.format("ota:activation:data:%s", safeDeviceId); - Map cacheMap = redisTemplate.opsForHash().entries(cacheDeviceKey); + Map cacheMap = (Map) redisUtils.get(cacheDeviceKey); if (cacheMap == null) { throw new RenException("激活码错误"); } @@ -116,8 +112,8 @@ public class DeviceServiceImpl extends BaseServiceImpl deviceDao.insert(deviceEntity); // 清理redis缓存 - redisTemplate.delete(cacheDeviceKey); - redisTemplate.delete(deviceKey); + redisUtils.delete(cacheDeviceKey); + redisUtils.delete(deviceKey); return true; } @@ -126,12 +122,24 @@ public class DeviceServiceImpl extends BaseServiceImpl DeviceReportReqDTO deviceReport) { DeviceReportRespDTO response = new DeviceReportRespDTO(); response.setServer_time(buildServerTime()); - // todo: 此处是固件信息,目前是针对固件上传上来的版本号再返回回去 - // 在未来开发了固件更新功能,需要更换此处代码, - // 或写定时任务定期请求虾哥的OTA,获取最新的版本讯息保存到服务内 + + String type = deviceReport.getBoard() == null ? null : deviceReport.getBoard().getType(); + OtaEntity ota = otaService.getLatestOta(type); + String downloadUrl = null; + if (ota != null) { + // 获取当前请求的URL + HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()) + .getRequest(); + String requestUrl = request.getRequestURL().toString(); + // 将URL中的/ota/替换为/otaMag/download/ + String uuid = UUID.randomUUID().toString(); + redisUtils.set(RedisKeys.getOtaIdKey(uuid), ota.getId()); + downloadUrl = requestUrl.replace("/ota/", "/otaMag/download/") + uuid; + } + DeviceReportRespDTO.Firmware firmware = new DeviceReportRespDTO.Firmware(); - firmware.setVersion(deviceReport.getApplication().getVersion()); - firmware.setUrl("http://localhost:8002/xiaozhi/ota/download"); + firmware.setVersion(ota.getVersion()); + firmware.setUrl(downloadUrl); response.setFirmware(firmware); // 添加WebSocket配置 @@ -252,7 +260,7 @@ public class DeviceServiceImpl extends BaseServiceImpl public String geCodeByDeviceId(String deviceId) { String dataKey = getDeviceCacheKey(deviceId); - Map cacheMap = redisTemplate.opsForHash().entries(dataKey); + Map cacheMap = (Map) redisUtils.get(dataKey); if (cacheMap != null && cacheMap.containsKey("activation_code")) { String cachedCode = (String) cacheMap.get("activation_code"); return cachedCode; @@ -299,12 +307,11 @@ public class DeviceServiceImpl extends BaseServiceImpl // 写入主数据 key String dataKey = getDeviceCacheKey(deviceId); - redisTemplate.opsForHash().putAll(dataKey, dataMap); - redisTemplate.expire(dataKey, 24, TimeUnit.HOURS); + redisUtils.set(dataKey, dataMap); // 写入反查激活码 key String codeKey = "ota:activation:code:" + newCode; - redisTemplate.opsForValue().set(codeKey, deviceId, 24, TimeUnit.HOURS); + redisUtils.set(codeKey, deviceId); } return code; } diff --git a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/OtaServiceImpl.java b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/OtaServiceImpl.java index aca69b9c..e06b088f 100644 --- a/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/OtaServiceImpl.java +++ b/main/manager-api/src/main/java/xiaozhi/modules/device/service/impl/OtaServiceImpl.java @@ -71,4 +71,9 @@ public class OtaServiceImpl extends BaseServiceImpl implement return baseDao.insert(entity) > 0; } + + @Override + public OtaEntity getLatestOta(String type) { + return baseDao.selectOne(new QueryWrapper().eq("type", type).orderByDesc("update_date")); + } } \ No newline at end of file