| | |
| | | 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.security.annotation.AnonymousAccess; |
| | | 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.HexUtils; |
| | | import com.sandu.ximon.admin.utils.StringUtil; |
| | | 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.util.Arrays; |
| | | import java.util.List; |
| | | import java.math.BigDecimal; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * 固件升级Controller |
| | |
| | | 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") |
| | |
| | | } |
| | | String orderType; |
| | | boolean UpdateFlag = false; |
| | | String deviceType; |
| | | |
| | | 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("升级硬件设备类型指令有误,请确认!"); |
| | | 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" |
| | |
| | | |
| | | 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 { |
| | |
| | | } |
| | | } |
| | | |
| | | @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); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 查询固件版本号 |