package com.sandu.ximon.admin.service; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.sandu.common.execption.BusinessException; import com.sandu.common.service.impl.BaseServiceImpl; import com.sandu.common.util.SpringContextHolder; import com.sandu.ximon.admin.dto.RemoteFileDto; import com.sandu.ximon.admin.dto.RemoteUpdateTypeDto; import com.sandu.ximon.admin.manager.iot.frame.A5Frame; import com.sandu.ximon.admin.manager.iot.frame.inner.report.*; import com.sandu.ximon.admin.manager.iot.frame.inner.request.*; import com.sandu.ximon.admin.manager.iot.rrpc.dto.CommonFrame; import com.sandu.ximon.admin.manager.iot.rrpc.enums.RemoteUpdateTypeEnum; import com.sandu.ximon.admin.manager.iot.rrpc.mainboard.MainBoardInvokeSyncService; import com.sandu.ximon.admin.manager.iot.rrpc.util.FileProcessingUtils; import com.sandu.ximon.admin.security.SecurityUtils; import com.sandu.ximon.admin.utils.StoreOperationRecordsUtils; import com.sandu.ximon.admin.utils.StringUtil; import com.sandu.ximon.dao.bo.RemoteUpdateFileBo; import com.sandu.ximon.dao.domain.Admin; import com.sandu.ximon.dao.domain.Client; import com.sandu.ximon.dao.domain.RemoteUpdateFile; import com.sandu.ximon.dao.mapper.RemoteUpdateFileMapper; import org.springframework.stereotype.Service; import java.io.IOException; import java.math.BigDecimal; import java.util.ArrayList; import java.util.List; /** * @author ZZQ * @date 2022/4/12 11:09 */ @Service public class RemoteUpdateService extends BaseServiceImpl { private RemoteUpdateFileMapper remoteUpdateFileMapper; /** * 添加文件更新内容 * * @param filename * @param fileType * @param softwareVersion * @param hardwareVersion * @param aliAddress */ public boolean addRemoteUpdateFile(String filename, String fileType, String softwareVersion , String hardwareVersion, String aliAddress, String fileLength) { RemoteUpdateFile remoteUpdateFile = new RemoteUpdateFile(); remoteUpdateFile.setAliAddress(aliAddress); remoteUpdateFile.setFileType(fileType); remoteUpdateFile.setUploadUserId(SecurityUtils.getUserId()); remoteUpdateFile.setUploadUserType(SecurityUtils.getClientId() == null ? 0 : 1); remoteUpdateFile.setSoftwareVersion(new BigDecimal(softwareVersion).setScale(2, BigDecimal.ROUND_DOWN)); remoteUpdateFile.setHardwareVersion(new BigDecimal(hardwareVersion).setScale(2, BigDecimal.ROUND_DOWN)); remoteUpdateFile.setFilename(filename); remoteUpdateFile.setFileLength(fileLength); return save(remoteUpdateFile); } /** * 修改固件升级文件名称 * * @param remoteFileId * @param remoteFileName * @return */ public String updateRemoteFileName(String remoteFileId, String remoteFileName) { if (remoteFileId == null || StringUtil.strIsNullOrEmpty(remoteFileName)) { throw new BusinessException("参数错误!"); } RemoteUpdateFile remoteUpdateFile = getById(remoteFileId); if (remoteUpdateFile == null) { throw new BusinessException("固件升级文件不存在!"); } remoteUpdateFile.setFilename(remoteFileName); boolean update = updateById(remoteUpdateFile); if (!update) { throw new BusinessException("修改固件升级文件名失败!"); } return "修改固件升级文件名成功!"; } /** * 固件升级文件 * * @return */ public List getRemoteFileList() { List list = list(); List adminList = SpringContextHolder.getBean(AdminService.class).list(); List clientList = SpringContextHolder.getBean(ClientService.class).list(); List remoteUpdateFileBoList = new ArrayList<>(); RemoteUpdateFileBo remoteUpdateFileBo; for (RemoteUpdateFile bean : list) { remoteUpdateFileBo = new RemoteUpdateFileBo(); BeanUtil.copyProperties(bean, remoteUpdateFileBo); if (bean.getUploadUserType() == 0) { for (Admin admin : adminList) { if (bean.getUploadUserId().equals(admin.getId())) { remoteUpdateFileBo.setUploadName(admin.getNickName()); } } } else if (bean.getUploadUserType() == 1) { for (Client client : clientList) { if (bean.getUploadUserId().equals(client.getId())) { remoteUpdateFileBo.setUploadName(client.getClientName()); } } } else { remoteUpdateFileBo.setUploadName("未知用户!"); } remoteUpdateFileBoList.add(remoteUpdateFileBo); } return remoteUpdateFileBoList; } /** * 远程升级类型 */ public List getRemoteUpdateTypeList() { return RemoteUpdateTypeEnum.getAllType(); } /** * 启动远程升级命令 * * @param mac 设备MAC地址 * @param hardwareVersion 硬件版本 * @param softwareVersion 软件版本 * @param updateFlag 升级标志 */ public boolean StartRemoteUpdate(String orderType, String mac, String hardwareVersion, String softwareVersion, String updateFlag) { RemoteStartUpdateReqInnerFrame remoteStartUpdateReqInnerFrame = new RemoteStartUpdateReqInnerFrame(hardwareVersion, softwareVersion, updateFlag); A5Frame a5Frame = new A5Frame(orderType, remoteStartUpdateReqInnerFrame); System.out.println(a5Frame + " a5Frame"); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); StoreOperationRecordsUtils.storeInnerFrameData(mac, "固件升级-启动远程升级", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); RemoteStartUpdateReportInnerFrame remoteStartUpdateReportInnerFrame = new RemoteStartUpdateReportInnerFrame().transformFrame(commonFrame.getPayload()); boolean flag; if (remoteStartUpdateReportInnerFrame.isValidate()) { switch (remoteStartUpdateReportInnerFrame.getOrderFlag()) { case "0": if ("1".equals(remoteStartUpdateReportInnerFrame.getUpdateFlag())) { System.out.println("开始升级相关步骤"); //服务器下发升级文件信息 flag = true; } else { System.out.println("不进行升级"); flag = false; } break; case "1": System.out.println("终端不在空闲状态"); flag = false; break; case "8": System.out.println("指令有误"); flag = false; break; default: flag = false; } } else { throw new BusinessException("数据校验错误,请重新请求"); } return flag; } /** * 服务器下发升级文件信息 * * @param filePath 文件路径地址 */ public RemoteFileDto UpdateFileInfo(String orderType, String mac, String filePath) { RemoteFileDto remoteFileDto = FileProcessingUtils.read(filePath); if (remoteFileDto == null) { throw new BusinessException("文件不存在"); } RemoteSendFileReqInnerFrame remoteSendFileReqInnerFrame = new RemoteSendFileReqInnerFrame(remoteFileDto.getListSize(), remoteFileDto.getList().size(), 512, remoteFileDto.getFileHexStr()); A5Frame a5Frame = new A5Frame(orderType, remoteSendFileReqInnerFrame); System.out.println(a5Frame + " a5Frame"); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); StoreOperationRecordsUtils.storeInnerFrameData(mac, "固件升级-升级文件信息", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); RemoteUpdateFileInfoReportInnerFrame remoteUpdateFileInfoReportInnerFrame = new RemoteUpdateFileInfoReportInnerFrame().transformFrame(commonFrame.getPayload()); //确认OK if (remoteUpdateFileInfoReportInnerFrame != null && remoteUpdateFileInfoReportInnerFrame.isFlag()) { return remoteFileDto; } else { return null; } } /** * 升级包数据 * * @param volumeOrder 卷序 * @param datas 升级包分卷数据 */ public void UpdateData(String orderType, String mac, int volumeOrder, String datas) { RemoteUpdateDataReqInnerFrame remoteUpdateDataReqInnerFrame = new RemoteUpdateDataReqInnerFrame(volumeOrder, datas); A5Frame a5Frame = new A5Frame(orderType, remoteUpdateDataReqInnerFrame); System.out.println(a5Frame + " a5Frame"); CommonFrame commonFrame = null; try { commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); System.out.println(commonFrame + " -----commonFrame"); } catch (Exception e) { System.out.println("发送数据超时或失败"); } StoreOperationRecordsUtils.storeInnerFrameData(mac, "固件升级-升级包数据", a5Frame, commonFrame); //FE B2 0004 0056 01 00 AE2C4474 } /** * 服务器下发查询漏包帧 */ public boolean SearchLoseData(String orderType, String mac, RemoteFileDto remoteFileDto, int resendTime) { RemoteSearchLoseDataReqInnerFrame remoteSearchLoseDataReqInnerFrame = new RemoteSearchLoseDataReqInnerFrame(); A5Frame a5Frame = new A5Frame(orderType, remoteSearchLoseDataReqInnerFrame); System.out.println(a5Frame + " a5Frame"); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); StoreOperationRecordsUtils.storeInnerFrameData(mac, "固件升级-查询漏包帧", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); RemoteSearchLoseDataReportInnerFrame remoteSearchLoseDataReportInnerFrame = new RemoteSearchLoseDataReportInnerFrame().transformFrame(commonFrame.getPayload()); //校验不通过,有漏包 if (!remoteSearchLoseDataReportInnerFrame.isCheckState()) { if (resendTime == 3) { throw new BusinessException("重发丢帧数据超次数,更新失败!"); } for (Integer integer : remoteSearchLoseDataReportInnerFrame.getList()) { UpdateData(orderType, mac, integer, remoteFileDto.getList().get(integer)); } SearchLoseData(orderType, mac, remoteFileDto, resendTime + 1); } return true; } /** * 服务器下发结束升级帧 */ public boolean FinishUpdate(String orderType, String mac) { RemoteFinishUpdateReqInnerFrame remoteFinishUpdateReqInnerFrame = new RemoteFinishUpdateReqInnerFrame(); A5Frame a5Frame = new A5Frame(orderType, remoteFinishUpdateReqInnerFrame); System.out.println(a5Frame + " a5Frame"); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); StoreOperationRecordsUtils.storeInnerFrameData(mac, "固件升级-升级结束", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); RemoteFinishUpdateReportInnerFrame remoteFinishUpdateReportInnerFrame = new RemoteFinishUpdateReportInnerFrame().transformFrame(commonFrame.getPayload()); //返回升级结果 return remoteFinishUpdateReportInnerFrame.isResponseState(); } /** * 服务器下发升级结果查询 */ public String SearchUpdateResult(String orderType, String mac) { RemoteSearchUpdateResultReqInnerFrame remoteSearchUpdateResultReqInnerFrame = new RemoteSearchUpdateResultReqInnerFrame(); A5Frame a5Frame = new A5Frame(orderType, remoteSearchUpdateResultReqInnerFrame); System.out.println(a5Frame + " a5Frame"); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); StoreOperationRecordsUtils.storeInnerFrameData(mac, "固件升级-升级结果查询", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); RemoteSearchUpdateResultReportInnerFrame innerFrame = new RemoteSearchUpdateResultReportInnerFrame().transformFrame(commonFrame.getPayload()); String result = "硬件版本:" + innerFrame.getHardwareVersion() + " 软件件版本:" + innerFrame.getSoftwareVersion(); return result; } /** * 服务器下发紧急中断升级控制帧 */ public boolean stopUpdate(String orderType, String mac) { RemoteStopUpdateReqInnerFrame remoteStopUpdateReqInnerFrame = new RemoteStopUpdateReqInnerFrame(); A5Frame a5Frame = new A5Frame(orderType, remoteStopUpdateReqInnerFrame); System.out.println(a5Frame + " a5Frame"); CommonFrame commonFrame = MainBoardInvokeSyncService.getInstance().sendRRPC(mac, a5Frame); StoreOperationRecordsUtils.storeInnerFrameData(mac, "固件升级-紧急中断", a5Frame, commonFrame); System.out.println(commonFrame + " -----commonFrame"); RemoteStopUpdateReportInnerFrame innerFrame = new RemoteStopUpdateReportInnerFrame().transformFrame(commonFrame.getPayload()); return innerFrame.isResponseState(); } }