wifi单独修改 ota升级 多语言优化等

This commit is contained in:
zzc 2024-10-23 01:48:36 +08:00
parent c84fcee9ba
commit fb0c6fc2fc
15 changed files with 294 additions and 12 deletions

View File

@ -23,6 +23,10 @@ public class CommonYmlConfig {
public static String URL_IOT_DEVICE = "设备信息"; public static String URL_IOT_DEVICE = "设备信息";
public static String URL_IOT_DEVICE_BY_NAME = "设备名称查询设备信息"; 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 username = "";
public String password = ""; public String password = "";
@ -33,6 +37,10 @@ public class CommonYmlConfig {
public String device = ""; public String device = "";
public String deviceByName = ""; public String deviceByName = "";
public String otaPackages = "";
public String credentials = "";
public String updateOta = "";
@Value("${iot.username}") @Value("${iot.username}")
public String setUsername(String username) { public String setUsername(String username) {
return URL_IOT_USERNAME = 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;
}
} }

View File

@ -93,9 +93,14 @@ public class EqDeviceController extends BaseController {
} }
/** /**
* 控制设备 灯光 控制 * ota升级到最新版本
* 传参设备编码
*/ */
@GetMapping("/ota")
public R<String> ota(String equipmentCode){
if (equipmentCode == null) throw new ServiceException("设备编码不能为空");
return R.ok(eqEquipmentService.ota(equipmentCode));
}
@GetMapping("/operate") @GetMapping("/operate")
public R<String> operate(EqDeviceCmdBo bo){ public R<String> operate(EqDeviceCmdBo bo){
if (bo.getEquipmentCode() == null) throw new ServiceException("设备编码不能为空"); if (bo.getEquipmentCode() == null) throw new ServiceException("设备编码不能为空");

View File

@ -83,7 +83,11 @@ public class EqTextController extends BaseController {
MessageUtils.message("login.name2"), MessageUtils.message("login.name2"),
MessageUtils.message("login.name3"), MessageUtils.message("login.name3"),
MessageUtils.message("login.name4"), 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 //注册register
@ -130,7 +134,10 @@ public class EqTextController extends BaseController {
MessageUtils.message("warningClose.name4"), MessageUtils.message("warningClose.name4"),
MessageUtils.message("warningClose.name5"), MessageUtils.message("warningClose.name5"),
MessageUtils.message("warningClose.name6"), 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 //添加设备add
@ -180,7 +187,14 @@ public class EqTextController extends BaseController {
MessageUtils.message("detail.name19"), MessageUtils.message("detail.name19"),
MessageUtils.message("detail.name20"), MessageUtils.message("detail.name20"),
MessageUtils.message("detail.name21"), 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 //倒计时设置countdown
@ -226,7 +240,8 @@ public class EqTextController extends BaseController {
MessageUtils.message("clearcode.name2"), MessageUtils.message("clearcode.name2"),
MessageUtils.message("clearcode.name3"), MessageUtils.message("clearcode.name3"),
MessageUtils.message("clearcode.name4"), MessageUtils.message("clearcode.name4"),
MessageUtils.message("clearcode.name5") MessageUtils.message("clearcode.name5"),
MessageUtils.message("clearcode.name6")
)); ));
//设备掉线详情offDetail //设备掉线详情offDetail
@ -259,7 +274,14 @@ public class EqTextController extends BaseController {
MessageUtils.message("set.name19"), MessageUtils.message("set.name19"),
MessageUtils.message("set.name20"), MessageUtils.message("set.name20"),
MessageUtils.message("set.name21"), 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 //通用setCommon
@ -538,7 +560,8 @@ public class EqTextController extends BaseController {
MessageUtils.message("ble.name69"), MessageUtils.message("ble.name69"),
MessageUtils.message("ble.name70"), MessageUtils.message("ble.name70"),
MessageUtils.message("ble.name71"), MessageUtils.message("ble.name71"),
MessageUtils.message("ble.name72") MessageUtils.message("ble.name72"),
MessageUtils.message("ble.name73")
)); ));
return R.ok(result); return R.ok(result);

View File

@ -40,6 +40,6 @@ public class DeviceCtlCmd {
public static final String RFControllorPair = "URC+ECTAS=GarageDoor,RFControllorPair,{},{},\r\n"; 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 RFControllorErase = "URC+ECTAS=GarageDoor,RFControllorErase,{},{},\r\n";
public static final String wifiDefault = "wifiDefault\r\n";//wifi默认值 随意填写
} }

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -41,6 +41,7 @@ public class EqDeviceCmdBo implements Serializable {
* 8.关灯 * 8.关灯
* 9对码 * 9对码
* 10.清码 * 10.清码
* 20.支持单独修改wifi
*/ */
private int operateType; private int operateType;
/** /**

View File

@ -106,4 +106,6 @@ public interface IEqEquipmentService {
* @return * @return
*/ */
EqEquipmentStatisticsVo selectEquipmentStatistic(Integer type, String startTime, String endTime); EqEquipmentStatisticsVo selectEquipmentStatistic(Integer type, String startTime, String endTime);
String ota(String equipmentCode);
} }

View File

@ -16,6 +16,7 @@ import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -50,6 +51,22 @@ public class IotService {
return postSendWithParam(CommonYmlConfig.URL_IOT_OPERATE, paramMap, JSON.toJSONString(dto)); 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<String, String> paramMap = new HashMap<>();
paramMap.put("deviceId",deviceCode);
return postSendWithParam(CommonYmlConfig.URL_IOT_OPERATE, paramMap, JSON.toJSONString(dto));
}
/** /**
* 获取设备信息 * 获取设备信息
* @param deviceCode * @param deviceCode
@ -197,6 +214,48 @@ public class IotService {
} }
/**
* 获取最新资源包
* @param deviceProfileId
* @return
*/
public DeviceOtaPackages httpOtaPackages(String deviceProfileId){
Map<String, String> map = new HashMap<>();
map.put("deviceProfileId",deviceProfileId);
String send = getSend(CommonYmlConfig.URL_IOT_ota_otaPackages, map);
List<DeviceOtaPackages> 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<String, String> 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<String, String> paramMap = new HashMap<>();
paramMap.put("accessToken",accessToken);
return postSendWithParam(CommonYmlConfig.URL_IOT_ota_updateOta, paramMap, JSON.toJSONString(dto));
}
public String getToken() { public String getToken() {
String token = tokenCache.getIfPresent("token"); String token = tokenCache.getIfPresent("token");
if (token == null){ if (token == null){

View File

@ -210,13 +210,19 @@ public class EqEquipmentServiceImpl implements IEqEquipmentService {
case 8: cmd = DeviceCtlCmd.LightSwitch_false; break;//照明灯开关 case 8: cmd = DeviceCtlCmd.LightSwitch_false; break;//照明灯开关
case 9: cmd = DeviceCtlCmd.RFControllorPair; break;//对码 case 9: cmd = DeviceCtlCmd.RFControllorPair; break;//对码
case 10: cmd = DeviceCtlCmd.RFControllorErase; break;//清码 case 10: cmd = DeviceCtlCmd.RFControllorErase; break;//清码
case 20: cmd = DeviceCtlCmd.wifiDefault; break;//wifi单独修改
default: default:
return "指令类型错误"; return "指令类型错误";
} }
//增加操作次数 更新到设备表中 //增加操作次数 更新到设备表中
if (operateType == 20){
return iotService.httpCtlPostWifiSend(bo.getEquipmentCode(),cmd);
}else {
return iotService.httpCtlPostSend(bo.getEquipmentCode(),cmd); return iotService.httpCtlPostSend(bo.getEquipmentCode(),cmd);
} }
}
@Override @Override
public String setting(EqDeviceSetBo bo) { public String setting(EqDeviceSetBo bo) {
String cmd = ""; String cmd = "";
@ -384,7 +390,22 @@ public class EqEquipmentServiceImpl implements IEqEquipmentService {
return result; 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);
}
/** /**

View File

@ -267,6 +267,9 @@ iot:
operate: /api/plugins/rpc/oneway/{deviceId} operate: /api/plugins/rpc/oneway/{deviceId}
device: /api/device/{deviceId} device: /api/device/{deviceId}
deviceByName: /api/tenant/devices?deviceName={deviceName} 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: getui:

View File

@ -266,3 +266,7 @@ iot:
telemetry: /api/plugins/telemetry/{entityType}/{entityId}/values/timeseries telemetry: /api/plugins/telemetry/{entityType}/{entityId}/values/timeseries
operate: /api/plugins/rpc/oneway/{deviceId} operate: /api/plugins/rpc/oneway/{deviceId}
device: /api/device/{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}

View File

@ -268,3 +268,7 @@ iot:
telemetry: /api/plugins/telemetry/{entityType}/{entityId}/values/timeseries telemetry: /api/plugins/telemetry/{entityType}/{entityId}/values/timeseries
operate: /api/plugins/rpc/oneway/{deviceId} operate: /api/plugins/rpc/oneway/{deviceId}
device: /api/device/{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}

View File

@ -113,6 +113,7 @@ login.name5=支持邮箱登录
login.name6=服务协议 login.name6=服务协议
login.name7=隐私协议 login.name7=隐私协议
login.name8=忘记密码 login.name8=忘记密码
login.name9=请先阅读并签署《服务协议》和《隐私协议》
##《注册》register ##《注册》register
register.name0=注册 register.name0=注册
register.name1=注册账号 register.name1=注册账号
@ -148,6 +149,9 @@ warningClose.name4=分钟了,请记得关门
warningClose.name5=关门 warningClose.name5=关门
warningClose.name6=我知道了 warningClose.name6=我知道了
warningClose.name7=是否关门? warningClose.name7=是否关门?
warningClose.name8=关门中……
warningClose.name9=开门中……
warningClose.name10=已暂停
##《添加设备》add ##《添加设备》add
add.name0=添加设备 add.name0=添加设备
add.name1=请输入设备编码 add.name1=请输入设备编码
@ -192,6 +196,7 @@ detail.name25=半开门管理
detail.name26=设备分享 detail.name26=设备分享
detail.name27=分钟 detail.name27=分钟
detail.name28=小时 detail.name28=小时
detail.name29=半门高度设置
##《倒计时设置》countdown ##《倒计时设置》countdown
countdown.name0=倒计时设置 countdown.name0=倒计时设置
countdown.name1=取消 countdown.name1=取消
@ -249,7 +254,7 @@ set.name11=自动关门
set.name12=打开此功能,当门开到最大时,在设置的倒计时时间内,门没有被控制,则在倒计时结束后,门会自动关闭。 set.name12=打开此功能,当门开到最大时,在设置的倒计时时间内,门没有被控制,则在倒计时结束后,门会自动关闭。
set.name13=自动关门时间设置 set.name13=自动关门时间设置
set.name14=运行次数 set.name14=运行次数
set.name15=WiFi网络 set.name15=更换WiFi
set.name16=时区 set.name16=时区
set.name17=设备型号 set.name17=设备型号
set.name18=序列号 set.name18=序列号
@ -258,6 +263,12 @@ set.name20=MCU版本
set.name21=删除设备 set.name21=删除设备
set.name22=启动自动开门功能,需要先打开红外保护感应功能 set.name22=启动自动开门功能,需要先打开红外保护感应功能
set.name23=设备删除成功,正在跳转首页…… set.name23=设备删除成功,正在跳转首页……
set.name24=设备版本号
set.name25=确认升级
set.name26=更换WiFi
set.name27=已连接WiFi
set.name28=当前设备版本号
set.name29=发现设备新版本
##《通用》setCommon ##《通用》setCommon
setCommon.detail=详情 setCommon.detail=详情
@ -462,7 +473,7 @@ ble.name38=连接蓝牙成功!
ble.name39=连接蓝牙失败!可尝试重新搜索,重启蓝牙,或重启应用! ble.name39=连接蓝牙失败!可尝试重新搜索,重启蓝牙,或重启应用!
ble.name40=蓝牙连接断开! ble.name40=蓝牙连接断开!
ble.name41=未知错误!尝试手动重启蓝牙,或重启应用! ble.name41=未知错误!尝试手动重启蓝牙,或重启应用!
ble.name42=配网成功! ble.name42=配网成功,设备正在初始化请等待3s……
ble.name43=密码错误,重新尝试! ble.name43=密码错误,重新尝试!
ble.name44=无法找到网络,重新尝试! ble.name44=无法找到网络,重新尝试!
ble.name45=设备断开连接,重新尝试! ble.name45=设备断开连接,重新尝试!
@ -493,6 +504,7 @@ ble.name69=观察显示器显示“A”此时设备开始配网
ble.name70=5.在APP上对设备进行配网直至配网完成 ble.name70=5.在APP上对设备进行配网直至配网完成
ble.name71=观察配网完成后显示器显示“11”设备进入待机装填 ble.name71=观察配网完成后显示器显示“11”设备进入待机装填
ble.name72=返回首页 ble.name72=返回首页
ble.name73=设备初始化成功,是否修改设备密码?
email.name0=登录验证码 email.name0=登录验证码
email.name1=您本次验证码为 email.name1=您本次验证码为