package com.sandu.ximon.admin.controller;
|
|
import com.alibaba.fastjson.JSON;
|
import com.sandu.common.domain.ResponseVO;
|
import com.sandu.common.execption.BusinessException;
|
import com.sandu.common.util.ResponseUtil;
|
import com.sandu.ximon.admin.dto.RemoteFileDto;
|
import com.sandu.ximon.admin.manager.iot.rrpc.enums.A5OrderEnum;
|
import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateTypeEnum;
|
import com.sandu.ximon.admin.param.RemotePrarm;
|
import com.sandu.ximon.admin.param.RemoteUpdateParam;
|
import com.sandu.ximon.admin.security.PermissionConfig;
|
import com.sandu.ximon.admin.security.SecurityUtils;
|
import com.sandu.ximon.admin.service.RemoteUpdateService;
|
import com.sandu.ximon.admin.utils.RedisUtils;
|
import com.sandu.ximon.admin.vo.RemoteUpgradeProgress;
|
import com.sandu.ximon.dao.enums.MenuEnum;
|
import lombok.AllArgsConstructor;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.validation.annotation.Validated;
|
import org.springframework.web.bind.annotation.*;
|
|
import java.math.BigDecimal;
|
import java.util.HashMap;
|
import java.util.Map;
|
|
/**
|
* 固件升级Controller
|
*
|
* @author ZZQ
|
* @date 2022/4/11 17:06
|
*/
|
@AllArgsConstructor
|
@RestController
|
@RequestMapping("/v1/remoteupdate")
|
public class RemoteUpdateController {
|
private RemoteUpdateService remoteUpdateService;
|
private PermissionConfig permissionConfig;
|
|
|
@PostMapping("/add")
|
public ResponseVO<Object> addRemoteUpdateFile(@RequestBody @Validated RemoteUpdateParam param) {
|
if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_FILE_ADD.getCode())) {
|
return ResponseUtil.fail("缺少对应用户权限");
|
}
|
boolean flag = remoteUpdateService.addRemoteUpdateFile(param.getFilename(), param.getFileType()
|
, param.getSoftwareVersion(), param.getHardwareVersion(), param.getAliAddress(), param.getFileLength());
|
return ResponseUtil.success(flag);
|
}
|
|
/**
|
* 修改固件升级文件名称
|
*
|
* @param remoteFileId
|
* @param remoteFileName
|
* @return
|
*/
|
@GetMapping("/updateRemoteFileName")
|
public ResponseVO<Object> updateRemoteFileName(@RequestParam(required = false, value = "remoteFileId") String remoteFileId,
|
@RequestParam(required = false, value = "remoteFileName") String remoteFileName) {
|
if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_FILE_UPDATE.getCode())) {
|
return ResponseUtil.fail("缺少对应用户权限");
|
}
|
String result = remoteUpdateService.updateRemoteFileName(remoteFileId, remoteFileName);
|
return ResponseUtil.success(result);
|
}
|
|
@GetMapping("/getRemoteFileList")
|
public ResponseVO<Object> getRemoteFileList() {
|
if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_FILE_LIST.getCode())) {
|
return ResponseUtil.fail("缺少对应用户权限");
|
}
|
return ResponseUtil.success(remoteUpdateService.getRemoteFileList());
|
}
|
|
@GetMapping("/getRemoteUpdateTypeList")
|
public ResponseVO<Object> getRemoteUpdateTypeList() {
|
if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_TYPE_LIST.getCode())) {
|
return ResponseUtil.fail("缺少对应用户权限");
|
}
|
return ResponseUtil.success(remoteUpdateService.getRemoteUpdateTypeList());
|
}
|
|
/**
|
* 启动远程升级命令
|
*
|
* @return
|
*/
|
@PostMapping("/StartRemoteUpdate")
|
public ResponseVO<Object> startRemoteUpdate(@RequestBody @Validated RemotePrarm remotePrarm) {
|
if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_START.getCode())) {
|
return ResponseUtil.fail("缺少对应用户权限");
|
}
|
String orderType;
|
boolean UpdateFlag = false;
|
String deviceType;
|
|
if(remotePrarm.getDeviceType()==null){
|
throw new BusinessException("升级硬件设备类型指令有误,请确认!");
|
}
|
if (RemoteUpdateTypeEnum.MQTT_MAIN.equals(remotePrarm.getDeviceType())) {
|
//MQTT主板
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.MQTT_MAIN;
|
} else if (RemoteUpdateTypeEnum.MQTT_CORE.equals(remotePrarm.getDeviceType())) {
|
//MQTT核心板
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.MQTT_CORE;
|
} else if (RemoteUpdateTypeEnum.LIGHT.equals(remotePrarm.getDeviceType())) {
|
//单灯模块
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.LIGHT;
|
} else if (RemoteUpdateTypeEnum.C3_CHARGING.equals(remotePrarm.getDeviceType())) {
|
//C3充电桩模块
|
orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.C3_CHARGING;
|
} else if (RemoteUpdateTypeEnum.CAT1_MAIN.equals(remotePrarm.getDeviceType())) {
|
//Cat.1主板
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.CAT1_MAIN;
|
} else if (RemoteUpdateTypeEnum.LIGHT_POLE_HELING.equals(remotePrarm.getDeviceType())) {
|
//灯杆倾斜模块
|
orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.LIGHT_POLE_HELING;
|
} else if (RemoteUpdateTypeEnum.AIR_EQUIPMENT.equals(remotePrarm.getDeviceType())) {
|
//大气设备模块
|
orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.AIR_EQUIPMENT;
|
} else {
|
throw new BusinessException("升级硬件设备类型指令有误,请确认!");
|
}
|
|
//启动远程升级命令
|
boolean startRemoteUpdateFlag = remoteUpdateService.StartRemoteUpdate(orderType, remotePrarm.getMac(), remotePrarm.getHardwareVersion()
|
, remotePrarm.getSoftwareVersion(), remotePrarm.getUpdateFlag());
|
//存入升级进度
|
RemoteUpgradeProgress progress = new RemoteUpgradeProgress();
|
RedisUtils.getBean().set(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
|
|
if (startRemoteUpdateFlag) {
|
//服务器下发升级文件信息
|
//"C:\\Users\\Administrator\\Desktop\\test\\MQTT-过滤大气版本1-09-20220310.bin"
|
RemoteFileDto remoteFileDto = remoteUpdateService.UpdateFileInfo(orderType, remotePrarm.getMac(), remotePrarm.getAliAddress());
|
|
if (remoteFileDto != null) {
|
System.out.println(remoteFileDto.getList().size());
|
progress.setTotalProgress(remoteFileDto.getList().size() + 1);
|
for (int i = 0; i < remoteFileDto.getList().size(); i++) {
|
//升级包数据
|
remoteUpdateService.UpdateData(orderType, remotePrarm.getMac(), i, remoteFileDto.getList().get(i));
|
progress.setCurrentProgress(i + 1);
|
if (i != remoteFileDto.getList().size()) {
|
RedisUtils.getBean().set(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
|
}
|
}
|
|
//服务器下发查询漏包帧
|
boolean searchLoseDataFlag = remoteUpdateService.SearchLoseData(orderType, remotePrarm.getMac(), remoteFileDto, 0);
|
if (searchLoseDataFlag) {
|
//无漏包情况 更新最后进度为100% 否则最高卡在99%
|
RedisUtils.getBean().set(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac(), JSON.toJSON(progress));
|
//服务器下发结束升级帧
|
boolean finishUpdateFlag = remoteUpdateService.FinishUpdate(orderType, remotePrarm.getMac());
|
UpdateFlag = finishUpdateFlag;
|
}
|
}
|
}
|
|
RedisUtils.getBean().delete(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac());
|
if (UpdateFlag) {
|
return ResponseUtil.success("升级成功!");
|
} else {
|
return ResponseUtil.fail("升级失败!");
|
}
|
}
|
|
@PostMapping("/getRemoteUpgradeProgress")
|
public ResponseVO<Object> getRemoteUpgradeProgress(@RequestBody RemotePrarm remotePrarm) {
|
// if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_START.getCode())) {
|
// return ResponseUtil.fail("缺少对应用户权限");
|
// }
|
String orderType;
|
String deviceType;
|
|
if(remotePrarm.getDeviceType()==null){
|
throw new BusinessException("升级硬件设备类型指令有误,请确认!");
|
}
|
if (RemoteUpdateTypeEnum.MQTT_MAIN.equals(remotePrarm.getDeviceType())) {
|
//MQTT主板
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.MQTT_MAIN;
|
} else if (RemoteUpdateTypeEnum.MQTT_CORE.equals(remotePrarm.getDeviceType())) {
|
//MQTT核心板
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.MQTT_CORE;
|
} else if (RemoteUpdateTypeEnum.LIGHT.equals(remotePrarm.getDeviceType())) {
|
//单灯模块
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.LIGHT;
|
} else if (RemoteUpdateTypeEnum.C3_CHARGING.equals(remotePrarm.getDeviceType())) {
|
//C3充电桩模块
|
orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.C3_CHARGING;
|
} else if (RemoteUpdateTypeEnum.CAT1_MAIN.equals(remotePrarm.getDeviceType())) {
|
//Cat.1主板
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.CAT1_MAIN;
|
} else if (RemoteUpdateTypeEnum.LIGHT_POLE_HELING.equals(remotePrarm.getDeviceType())) {
|
//灯杆倾斜模块
|
orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.LIGHT_POLE_HELING;
|
} else if (RemoteUpdateTypeEnum.AIR_EQUIPMENT.equals(remotePrarm.getDeviceType())) {
|
//大气设备模块
|
orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
|
deviceType=RemoteUpdateTypeEnum.AIR_EQUIPMENT;
|
} else {
|
throw new BusinessException("升级硬件设备类型指令有误,请确认!");
|
}
|
|
RemoteUpgradeProgress progress = new RemoteUpgradeProgress();
|
String s = RedisUtils.getBean().get(deviceType + ":" + SecurityUtils.getUserId() + remotePrarm.getMac());
|
if (s != null) {
|
RemoteUpgradeProgress temp = JSON.parseObject(s, RemoteUpgradeProgress.class);
|
BeanUtils.copyProperties(temp, progress);
|
}
|
Map map = new HashMap<>();
|
if (progress.getTotalProgress() != 0) {
|
//说明开始升级成功 存在非0进度
|
BigDecimal divide = BigDecimal.valueOf(progress.getCurrentProgress()).divide(BigDecimal.valueOf(progress.getTotalProgress()), 2, BigDecimal.ROUND_HALF_UP);
|
map.put("progress", divide);
|
|
return ResponseUtil.success(map);
|
} else {
|
map.put("progress", BigDecimal.valueOf(0.0));
|
return ResponseUtil.success(map);
|
}
|
}
|
|
/**
|
* 查询固件版本号
|
*
|
* @param remotePrarm
|
* @return
|
*/
|
@PostMapping("/searchUpdateResult")
|
public ResponseVO<Object> searchUpdateResult(@RequestBody RemotePrarm remotePrarm) {
|
if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_VERSION.getCode())) {
|
return ResponseUtil.fail("缺少对应用户权限");
|
}
|
if (remotePrarm.getMac() == null || remotePrarm.getDeviceType() == null) {
|
throw new BusinessException("缺少相关参数!");
|
}
|
String orderType;
|
switch (remotePrarm.getDeviceType()) {
|
case "MQTT串口":
|
case "CAT1":
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
break;
|
case "大气":
|
orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
|
break;
|
case "C3充电桩":
|
orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
|
break;
|
case "杆体倾斜":
|
orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
|
break;
|
default:
|
throw new BusinessException("升级硬件设备类型指令有误,请确认!");
|
}
|
|
//服务器下发升级结果查询
|
String result = remoteUpdateService.SearchUpdateResult(orderType, remotePrarm.getMac());
|
return ResponseUtil.success(result);
|
}
|
|
/**
|
* 紧急中断升级控制帧
|
*
|
* @param remotePrarm
|
* @return
|
*/
|
@PostMapping("/stopUpdate")
|
public ResponseVO<Object> stopUpdate(@RequestBody RemotePrarm remotePrarm) {
|
if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_STOP.getCode())) {
|
return ResponseUtil.fail("缺少对应用户权限");
|
}
|
if (remotePrarm.getMac() == null || remotePrarm.getDeviceType() == null) {
|
throw new BusinessException("缺少相关参数!");
|
}
|
String orderType;
|
switch (remotePrarm.getDeviceType()) {
|
case "MQTT串口":
|
case "CAT1":
|
orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode();
|
break;
|
case "大气":
|
orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode();
|
break;
|
case "C3充电桩":
|
orderType = A5OrderEnum.REQUEST_C3_DATA.getCode();
|
break;
|
case "杆体倾斜":
|
orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode();
|
break;
|
default:
|
throw new BusinessException("升级硬件设备类型指令有误,请确认!");
|
}
|
|
//服务器下发升级结果查询
|
boolean flag = remoteUpdateService.stopUpdate(orderType, remotePrarm.getMac());
|
if (flag) {
|
return ResponseUtil.success("紧急结束升级成功");
|
} else {
|
return ResponseUtil.success("紧急结束升级失败");
|
}
|
}
|
}
|