diff --git a/ruoyi-admin/src/main/java/org/dromara/web/config/CommonYmlConfig.java b/ruoyi-admin/src/main/java/org/dromara/web/config/CommonYmlConfig.java index 08afe81f6..9eab4ed03 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/config/CommonYmlConfig.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/config/CommonYmlConfig.java @@ -23,6 +23,10 @@ public class CommonYmlConfig { public static String URL_IOT_DEVICE = "设备信息"; public static String URL_IOT_DEVICE_BY_NAME = "设备名称查询设备信息"; + public static String URL_IOT_ota_otaPackages = "查询ota升级包"; + public static String URL_IOT_ota_credentials = "获取凭证"; + public static String URL_IOT_ota_updateOta = "更新ota"; + public String username = ""; public String password = ""; @@ -33,6 +37,10 @@ public class CommonYmlConfig { public String device = ""; public String deviceByName = ""; + public String otaPackages = ""; + public String credentials = ""; + public String updateOta = ""; + @Value("${iot.username}") public String setUsername(String username) { return URL_IOT_USERNAME = username; @@ -73,4 +81,18 @@ public class CommonYmlConfig { } + @Value("${iot.url.otaPackages}") + public String setOtaPackages(String otaPackages) { + return URL_IOT_ota_otaPackages = otaPackages; + } + + @Value("${iot.url.credentials}") + public String setCredentials(String credentials) { + return URL_IOT_ota_credentials = credentials; + } + + @Value("${iot.url.updateOta}") + public String setUpdateOta(String updateOta) { + return URL_IOT_ota_updateOta = updateOta; + } } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqDeviceController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqDeviceController.java index 52c703a91..f735600a3 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqDeviceController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqDeviceController.java @@ -93,9 +93,14 @@ public class EqDeviceController extends BaseController { } /** - * 控制设备 门 灯光 控制 - * 传参设备编码 + * ota升级到最新版本 */ + @GetMapping("/ota") + public R ota(String equipmentCode){ + if (equipmentCode == null) throw new ServiceException("设备编码不能为空"); + return R.ok(eqEquipmentService.ota(equipmentCode)); + } + @GetMapping("/operate") public R operate(EqDeviceCmdBo bo){ if (bo.getEquipmentCode() == null) throw new ServiceException("设备编码不能为空"); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqTextController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqTextController.java index 70afae5aa..ff6e4321f 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqTextController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/app/EqTextController.java @@ -83,7 +83,11 @@ public class EqTextController extends BaseController { MessageUtils.message("login.name2"), MessageUtils.message("login.name3"), MessageUtils.message("login.name4"), - MessageUtils.message("login.name5") + MessageUtils.message("login.name5"), + MessageUtils.message("login.name6"), + MessageUtils.message("login.name7"), + MessageUtils.message("login.name8"), + MessageUtils.message("login.name9") )); //《注册》register @@ -130,7 +134,10 @@ public class EqTextController extends BaseController { MessageUtils.message("warningClose.name4"), MessageUtils.message("warningClose.name5"), MessageUtils.message("warningClose.name6"), - MessageUtils.message("warningClose.name7") + MessageUtils.message("warningClose.name7"), + MessageUtils.message("warningClose.name8"), + MessageUtils.message("warningClose.name9"), + MessageUtils.message("warningClose.name10") )); //《添加设备》add @@ -180,7 +187,14 @@ public class EqTextController extends BaseController { MessageUtils.message("detail.name19"), MessageUtils.message("detail.name20"), MessageUtils.message("detail.name21"), - MessageUtils.message("detail.name22") + MessageUtils.message("detail.name22"), + MessageUtils.message("detail.name23"), + MessageUtils.message("detail.name24"), + MessageUtils.message("detail.name25"), + MessageUtils.message("detail.name26"), + MessageUtils.message("detail.name27"), + MessageUtils.message("detail.name28"), + MessageUtils.message("detail.name29") )); //《倒计时设置》countdown @@ -226,7 +240,8 @@ public class EqTextController extends BaseController { MessageUtils.message("clearcode.name2"), MessageUtils.message("clearcode.name3"), MessageUtils.message("clearcode.name4"), - MessageUtils.message("clearcode.name5") + MessageUtils.message("clearcode.name5"), + MessageUtils.message("clearcode.name6") )); //《设备掉线详情》offDetail @@ -259,7 +274,14 @@ public class EqTextController extends BaseController { MessageUtils.message("set.name19"), MessageUtils.message("set.name20"), MessageUtils.message("set.name21"), - MessageUtils.message("set.name22") + MessageUtils.message("set.name22"), + MessageUtils.message("set.name23"), + MessageUtils.message("set.name24"), + MessageUtils.message("set.name25"), + MessageUtils.message("set.name26"), + MessageUtils.message("set.name27"), + MessageUtils.message("set.name28"), + MessageUtils.message("set.name29") )); //《通用》setCommon @@ -538,7 +560,8 @@ public class EqTextController extends BaseController { MessageUtils.message("ble.name69"), MessageUtils.message("ble.name70"), MessageUtils.message("ble.name71"), - MessageUtils.message("ble.name72") + MessageUtils.message("ble.name72"), + MessageUtils.message("ble.name73") )); return R.ok(result); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/device/DeviceCtlCmd.java b/ruoyi-admin/src/main/java/org/dromara/web/device/DeviceCtlCmd.java index f48e1bd8d..ea08591be 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/device/DeviceCtlCmd.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/device/DeviceCtlCmd.java @@ -40,6 +40,6 @@ public class DeviceCtlCmd { public static final String RFControllorPair = "URC+ECTAS=GarageDoor,RFControllorPair,{},{},\r\n"; public static final String RFControllorErase = "URC+ECTAS=GarageDoor,RFControllorErase,{},{},\r\n"; - + public static final String wifiDefault = "wifiDefault\r\n";//wifi默认值 随意填写 } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceCredentials.java b/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceCredentials.java new file mode 100644 index 000000000..1d0b0f808 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceCredentials.java @@ -0,0 +1,37 @@ +package org.dromara.web.device.iot; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @ClassName : DeviceCredentials + * @Author : ZZC + * @Date : 2024/10/23 1:19 + * @Description : + **/ +@NoArgsConstructor +@Data +public class DeviceCredentials implements Serializable { + + private IdDTO id; + private Long createdTime; + private DeviceIdDTO deviceId; + private String credentialsType; + private String credentialsId; + private Object credentialsValue; + + @NoArgsConstructor + @Data + public static class IdDTO { + private String id; + } + + @NoArgsConstructor + @Data + public static class DeviceIdDTO { + private String entityType; + private String id; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceOtaPackages.java b/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceOtaPackages.java new file mode 100644 index 000000000..74d1ecc4b --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceOtaPackages.java @@ -0,0 +1,61 @@ +package org.dromara.web.device.iot; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @ClassName : DeviceOtaPackages + * @Author : ZZC + * @Date : 2024/10/23 1:09 + * @Description : 设备更新包 + **/ +@NoArgsConstructor +@Data +public class DeviceOtaPackages implements Serializable { + + private IdDTO id; + private Long createdTime; + private AdditionalInfoDTO additionalInfo; + private TenantIdDTO tenantId; + private DeviceProfileIdDTO deviceProfileId; + private String type; + private String title; + private String version; + private String tag; + private Object url; + private Boolean hasData; + private String fileName; + private String contentType; + private String checksumAlgorithm; + private String checksum; + private Integer dataSize; + + @NoArgsConstructor + @Data + public static class IdDTO { + private String entityType; + private String id; + } + + @NoArgsConstructor + @Data + public static class AdditionalInfoDTO { + private String description; + } + + @NoArgsConstructor + @Data + public static class TenantIdDTO { + private String entityType; + private String id; + } + + @NoArgsConstructor + @Data + public static class DeviceProfileIdDTO { + private String entityType; + private String id; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceWifiCtlDto.java b/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceWifiCtlDto.java new file mode 100644 index 000000000..78d593115 --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/device/iot/DeviceWifiCtlDto.java @@ -0,0 +1,28 @@ +package org.dromara.web.device.iot; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * @ClassName : DeviceCtlDto + * @Author : ZZC + * @Date : 2024/7/25 11:21 + * @Discription : 控制入参 + **/ +@NoArgsConstructor +@Data +public class DeviceWifiCtlDto implements Serializable { + + private String method = "setGpio"; + private Params params; + private Boolean persistent = false; + private Integer timeout = 5000; + + @NoArgsConstructor + @Data + public static class Params { + private String wifireset; + } +} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EqDeviceCmdBo.java b/ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EqDeviceCmdBo.java index b66eb40ed..7075ff770 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EqDeviceCmdBo.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/domain/bo/EqDeviceCmdBo.java @@ -41,6 +41,7 @@ public class EqDeviceCmdBo implements Serializable { * 8.关灯 * 9对码 * 10.清码 + * 20.支持单独修改wifi */ private int operateType; /** diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/IEqEquipmentService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/IEqEquipmentService.java index 249f9d261..c2029d4bf 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/IEqEquipmentService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/IEqEquipmentService.java @@ -106,4 +106,6 @@ public interface IEqEquipmentService { * @return */ EqEquipmentStatisticsVo selectEquipmentStatistic(Integer type, String startTime, String endTime); + + String ota(String equipmentCode); } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/IotService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/IotService.java index 118449f51..b8b9245c4 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/IotService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/IotService.java @@ -16,6 +16,7 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Objects; @@ -50,6 +51,22 @@ public class IotService { return postSendWithParam(CommonYmlConfig.URL_IOT_OPERATE, paramMap, JSON.toJSONString(dto)); } + /** + * 单独修改wifi + * @param deviceCode + * @param cmd + * @return + */ + public String httpCtlPostWifiSend(String deviceCode,String cmd){ + DeviceWifiCtlDto dto = new DeviceWifiCtlDto(); + DeviceWifiCtlDto.Params params = new DeviceWifiCtlDto.Params(); + params.setWifireset(cmd); + dto.setParams(params); + Map paramMap = new HashMap<>(); + paramMap.put("deviceId",deviceCode); + return postSendWithParam(CommonYmlConfig.URL_IOT_OPERATE, paramMap, JSON.toJSONString(dto)); + } + /** * 获取设备信息 * @param deviceCode @@ -197,6 +214,48 @@ public class IotService { } + + /** + * 获取最新资源包 + * @param deviceProfileId + * @return + */ + public DeviceOtaPackages httpOtaPackages(String deviceProfileId){ + Map map = new HashMap<>(); + map.put("deviceProfileId",deviceProfileId); + String send = getSend(CommonYmlConfig.URL_IOT_ota_otaPackages, map); + List deviceOtaPackages = JSON.parseArray(send, DeviceOtaPackages.class); + DeviceOtaPackages deviceDto = deviceOtaPackages.get(0); + if (deviceDto.getId()==null) throw new RuntimeException(MessageUtils.message("message.fault.device.notfound")); + return deviceDto; + } + + /** + * 查询设备凭证 + * @param deviceId + * @return + */ + public DeviceCredentials httpCredentials(String deviceId){ + Map map = new HashMap<>(); + map.put("deviceId",deviceId); + String send = getSend(CommonYmlConfig.URL_IOT_ota_credentials, map); + JSONObject jsonObject = JSON.parseObject(send); + DeviceCredentials deviceDto = jsonObject.toJavaObject(DeviceCredentials.class); + if (deviceDto.getId()==null) throw new RuntimeException(MessageUtils.message("message.fault.device.notfound")); + return deviceDto; + } + + /** + * 查询设备凭证 + */ + public String httpPostUpdateOta(String accessToken,DeviceDto dto){ + Map paramMap = new HashMap<>(); + paramMap.put("accessToken",accessToken); + return postSendWithParam(CommonYmlConfig.URL_IOT_ota_updateOta, paramMap, JSON.toJSONString(dto)); + } + + + public String getToken() { String token = tokenCache.getIfPresent("token"); if (token == null){ diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EqEquipmentServiceImpl.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EqEquipmentServiceImpl.java index feced416f..f69008d32 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EqEquipmentServiceImpl.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EqEquipmentServiceImpl.java @@ -210,11 +210,17 @@ public class EqEquipmentServiceImpl implements IEqEquipmentService { case 8: cmd = DeviceCtlCmd.LightSwitch_false; break;//照明灯开关 关 case 9: cmd = DeviceCtlCmd.RFControllorPair; break;//对码 case 10: cmd = DeviceCtlCmd.RFControllorErase; break;//清码 + case 20: cmd = DeviceCtlCmd.wifiDefault; break;//wifi单独修改 default: return "指令类型错误"; } //增加操作次数 更新到设备表中 - return iotService.httpCtlPostSend(bo.getEquipmentCode(),cmd); + if (operateType == 20){ + return iotService.httpCtlPostWifiSend(bo.getEquipmentCode(),cmd); + }else { + return iotService.httpCtlPostSend(bo.getEquipmentCode(),cmd); + } + } @Override @@ -384,7 +390,22 @@ public class EqEquipmentServiceImpl implements IEqEquipmentService { return result; } + @Override + public String ota(String equipmentCode) { + //1.从iot平台设置用户绑定 并获取设备信息 + DeviceDto deviceDto = iotService.httpDeviceGetSend(equipmentCode); + DeviceDto.DeviceProfileId deviceProfileId = deviceDto.getDeviceProfileId(); + String profileIdId = deviceProfileId.getId();//获取配置id + //2.查询OTA资源包 + DeviceOtaPackages deviceOtaPackages = iotService.httpOtaPackages(profileIdId); + //3.查询设备凭证 + DeviceCredentials deviceCredentials = iotService.httpCredentials(equipmentCode); + String assesToken = deviceCredentials.getCredentialsId(); + //4拿到凭证修改设备 使用获取设备信息的类信息作为参数 + deviceDto.getFirmwareId().setId(deviceOtaPackages.getId().getId());//设置升级包id + return iotService.httpPostUpdateOta(assesToken,deviceDto); + } /** diff --git a/ruoyi-admin/src/main/resources/application-dev.yml b/ruoyi-admin/src/main/resources/application-dev.yml index c854d2526..dc2d5f55e 100644 --- a/ruoyi-admin/src/main/resources/application-dev.yml +++ b/ruoyi-admin/src/main/resources/application-dev.yml @@ -267,6 +267,9 @@ iot: operate: /api/plugins/rpc/oneway/{deviceId} device: /api/device/{deviceId} deviceByName: /api/tenant/devices?deviceName={deviceName} + otaPackages: /api/otaPackages/{deviceProfileId}/FIRMWARE?pageSize=10&page=0 + credentials: /api/device/{deviceId}/credentials + updateOta: /api/device?accessToken={accessToken} # 个推 getui: diff --git a/ruoyi-admin/src/main/resources/application-local.yml b/ruoyi-admin/src/main/resources/application-local.yml index 1517240b8..452d7d242 100644 --- a/ruoyi-admin/src/main/resources/application-local.yml +++ b/ruoyi-admin/src/main/resources/application-local.yml @@ -266,3 +266,7 @@ iot: telemetry: /api/plugins/telemetry/{entityType}/{entityId}/values/timeseries operate: /api/plugins/rpc/oneway/{deviceId} device: /api/device/{deviceId} + deviceByName: /api/tenant/devices?deviceName={deviceName} + otaPackages: /api/otaPackages/{deviceProfileId}/FIRMWARE?pageSize=10&page=0 + credentials: /api/device/{deviceId}/credentials + updateOta: /api/device?accessToken={accessToken} diff --git a/ruoyi-admin/src/main/resources/application-prod.yml b/ruoyi-admin/src/main/resources/application-prod.yml index 8edad9823..d1b2edaf8 100644 --- a/ruoyi-admin/src/main/resources/application-prod.yml +++ b/ruoyi-admin/src/main/resources/application-prod.yml @@ -268,3 +268,7 @@ iot: telemetry: /api/plugins/telemetry/{entityType}/{entityId}/values/timeseries operate: /api/plugins/rpc/oneway/{deviceId} device: /api/device/{deviceId} + deviceByName: /api/tenant/devices?deviceName={deviceName} + otaPackages: /api/otaPackages/{deviceProfileId}/FIRMWARE?pageSize=10&page=0 + credentials: /api/device/{deviceId}/credentials + updateOta: /api/device?accessToken={accessToken} diff --git a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties index ed2dc8141..9187081fb 100644 --- a/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties +++ b/ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties @@ -113,6 +113,7 @@ login.name5=支持邮箱登录 login.name6=服务协议 login.name7=隐私协议 login.name8=忘记密码 +login.name9=请先阅读并签署《服务协议》和《隐私协议》 ##《注册》register register.name0=注册 register.name1=注册账号 @@ -148,6 +149,9 @@ warningClose.name4=分钟了,请记得关门 warningClose.name5=关门 warningClose.name6=我知道了 warningClose.name7=是否关门? +warningClose.name8=关门中…… +warningClose.name9=开门中…… +warningClose.name10=已暂停 ##《添加设备》add add.name0=添加设备 add.name1=请输入设备编码 @@ -192,6 +196,7 @@ detail.name25=半开门管理 detail.name26=设备分享 detail.name27=分钟 detail.name28=小时 +detail.name29=半门高度设置 ##《倒计时设置》countdown countdown.name0=倒计时设置 countdown.name1=取消 @@ -249,7 +254,7 @@ set.name11=自动关门 set.name12=打开此功能,当门开到最大时,在设置的倒计时时间内,门没有被控制,则在倒计时结束后,门会自动关闭。 set.name13=自动关门时间设置 set.name14=运行次数 -set.name15=WiFi网络 +set.name15=更换WiFi set.name16=时区 set.name17=设备型号 set.name18=序列号 @@ -258,6 +263,12 @@ set.name20=MCU版本 set.name21=删除设备 set.name22=启动自动开门功能,需要先打开红外保护感应功能 set.name23=设备删除成功,正在跳转首页…… +set.name24=设备版本号 +set.name25=确认升级 +set.name26=更换WiFi +set.name27=已连接WiFi +set.name28=当前设备版本号 +set.name29=发现设备新版本 ##《通用》setCommon setCommon.detail=详情 @@ -462,7 +473,7 @@ ble.name38=连接蓝牙成功! ble.name39=连接蓝牙失败!可尝试重新搜索,重启蓝牙,或重启应用! ble.name40=蓝牙连接断开! ble.name41=未知错误!尝试手动重启蓝牙,或重启应用! -ble.name42=配网成功! +ble.name42=配网成功,设备正在初始化,请等待3s…… ble.name43=密码错误,重新尝试! ble.name44=无法找到网络,重新尝试! ble.name45=设备断开连接,重新尝试! @@ -493,6 +504,7 @@ ble.name69=观察:显示器显示“A”,此时设备开始配网; ble.name70=5.在APP上对设备进行配网,直至配网完成; ble.name71=观察:配网完成后显示器显示“11”,设备进入待机装填; ble.name72=返回首页 +ble.name73=设备初始化成功,是否修改设备密码? email.name0=登录验证码 email.name1=您本次验证码为