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 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 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 getRemoteFileList() { if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_FILE_LIST.getCode())) { return ResponseUtil.fail("缺少对应用户权限"); } return ResponseUtil.success(remoteUpdateService.getRemoteFileList()); } @GetMapping("/getRemoteUpdateTypeList") public ResponseVO getRemoteUpdateTypeList() { if (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_TYPE_LIST.getCode())) { return ResponseUtil.fail("缺少对应用户权限"); } return ResponseUtil.success(remoteUpdateService.getRemoteUpdateTypeList()); } /** * 启动远程升级命令 * * @return */ @PostMapping("/StartRemoteUpdate") public ResponseVO 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 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 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 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("紧急结束升级失败"); } } }