| | |
| | | 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 |
| | |
| | | @RequestMapping("/v1/remoteupdate") |
| | | public class RemoteUpdateController { |
| | | private RemoteUpdateService remoteUpdateService; |
| | | private PermissionConfig permissionConfig; |
| | | |
| | | @AnonymousAccess |
| | | |
| | | @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); |
| | | } |
| | | |
| | | @AnonymousAccess |
| | | /** |
| | | * 修改固件升级文件名称 |
| | | * |
| | | * @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 |
| | | */ |
| | | //TODO |
| | | @AnonymousAccess |
| | | @PostMapping("/StartRemoteUpdate") |
| | | public ResponseVO<Object> startRemoteUpdate(@RequestBody @Validated RemotePrarm remotePrarm) { |
| | | String orderType; |
| | | boolean UpdateFlag = false; |
| | | |
| | | 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 (!permissionConfig.check(MenuEnum.REMOTE_UPDATE_START.getCode())) { |
| | | return ResponseUtil.fail("缺少对应用户权限"); |
| | | } |
| | | |
| | | String deviceType = remotePrarm.getDeviceType(); |
| | | String orderType = deviceType2OrderType(deviceType); |
| | | boolean UpdateFlag = false; |
| | | |
| | | //启动远程升级命令 |
| | | 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 deviceType = remotePrarm.getDeviceType(); |
| | | |
| | | isDeviceType(deviceType); |
| | | |
| | | 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 |
| | | */ |
| | | @AnonymousAccess |
| | | @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 orderType = deviceType2OrderType(remotePrarm.getDeviceType()); |
| | | |
| | | //服务器下发升级结果查询 |
| | | String result = remoteUpdateService.SearchUpdateResult(orderType, remotePrarm.getMac()); |
| | |
| | | * @param remotePrarm |
| | | * @return |
| | | */ |
| | | @AnonymousAccess |
| | | @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("升级硬件设备类型指令有误,请确认!"); |
| | | } |
| | | String orderType = deviceType2OrderType(remotePrarm.getDeviceType()); |
| | | |
| | | //服务器下发升级结果查询 |
| | | boolean flag = remoteUpdateService.stopUpdate(orderType, remotePrarm.getMac()); |
| | |
| | | return ResponseUtil.success("紧急结束升级失败"); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 设备类型转指令类型 |
| | | * |
| | | * @param deviceType |
| | | * @return |
| | | */ |
| | | private String deviceType2OrderType(String deviceType) { |
| | | String orderType; |
| | | if (RemoteUpdateTypeEnum.MQTT_MAIN.equals(deviceType)) { |
| | | //MQTT主板 |
| | | orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode(); |
| | | } else if (RemoteUpdateTypeEnum.MQTT_CORE.equals(deviceType)) { |
| | | //MQTT核心板 |
| | | orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode(); |
| | | } else if (RemoteUpdateTypeEnum.LIGHT.equals(deviceType)) { |
| | | //单灯模块 |
| | | orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode(); |
| | | } else if (RemoteUpdateTypeEnum.C3_CHARGING.equals(deviceType)) { |
| | | //C3充电桩模块 |
| | | orderType = A5OrderEnum.REQUEST_C3_DATA.getCode(); |
| | | } else if (RemoteUpdateTypeEnum.CAT1_MAIN.equals(deviceType)) { |
| | | //Cat.1主板 |
| | | orderType = A5OrderEnum.REQUEST_LIGHT_DATA.getCode(); |
| | | } else if (RemoteUpdateTypeEnum.LIGHT_POLE_HELING.equals(deviceType)) { |
| | | //灯杆倾斜模块 |
| | | orderType = A5OrderEnum.REQUEST_POLE_MONITOR_DATA.getCode(); |
| | | } else if (RemoteUpdateTypeEnum.AIR_EQUIPMENT.equals(deviceType)) { |
| | | //大气设备模块 |
| | | orderType = A5OrderEnum.REQUEST_ATMOSPHERE_DATA.getCode(); |
| | | } else { |
| | | throw new BusinessException("升级硬件设备类型指令有误,请确认!"); |
| | | } |
| | | return orderType; |
| | | } |
| | | |
| | | /** |
| | | * 是否为系统内的设备类型 |
| | | * |
| | | * @param deviceType |
| | | * @return |
| | | */ |
| | | private boolean isDeviceType(String deviceType) { |
| | | if (RemoteUpdateTypeEnum.MQTT_MAIN.equals(deviceType)) { |
| | | //MQTT主板 |
| | | } else if (RemoteUpdateTypeEnum.MQTT_CORE.equals(deviceType)) { |
| | | //MQTT核心板 |
| | | } else if (RemoteUpdateTypeEnum.LIGHT.equals(deviceType)) { |
| | | //单灯模块 |
| | | } else if (RemoteUpdateTypeEnum.C3_CHARGING.equals(deviceType)) { |
| | | //C3充电桩模块 |
| | | } else if (RemoteUpdateTypeEnum.CAT1_MAIN.equals(deviceType)) { |
| | | //Cat.1主板 |
| | | } else if (RemoteUpdateTypeEnum.LIGHT_POLE_HELING.equals(deviceType)) { |
| | | //灯杆倾斜模块 |
| | | } else if (RemoteUpdateTypeEnum.AIR_EQUIPMENT.equals(deviceType)) { |
| | | //大气设备模块 |
| | | } else { |
| | | throw new BusinessException("升级硬件设备类型指令有误,请确认!"); |
| | | } |
| | | return true; |
| | | } |
| | | } |