| | |
| | | package com.dy.aceMw.web.com; |
| | | |
| | | import com.dy.aceMw.server.forTcp.TcpSessionCache; |
| | | import com.dy.aceMw.server.local.CommandInnerDeaLer; |
| | | import com.dy.aceMw.server.local.ReturnCommand; |
| | | import com.dy.aceMw.server.tasks.RtuDownTask; |
| | | import com.dy.common.mw.core.CoreUnit; |
| | | import com.dy.common.mw.protocol.Command; |
| | | import com.dy.common.mw.protocol.CommandType; |
| | | import com.dy.common.webUtil.BaseResponse; |
| | | import com.dy.common.webUtil.BaseResponseUtils; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | * @Author liurunyu |
| | | * @Date 2023/12/21 13:58 |
| | | * @LastEditTime 2023/12/21 13:58 |
| | | * @Description |
| | | * @Description 命令接收 |
| | | */ |
| | | @Slf4j |
| | | @RestController |
| | |
| | | |
| | | @PostMapping(path = "send", consumes = MediaType.APPLICATION_JSON_VALUE) |
| | | public BaseResponse<Command> send(@RequestBody Command com) { |
| | | return BaseResponseUtils.buildSuccess(com); |
| | | log.info("收到web系统发来的命令:\n" + com.toString()) ; |
| | | |
| | | String commandType = com.getType() ; |
| | | if(commandType == null){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,收到命令的命令类型为空!", com.getId(), com.getCode())); |
| | | } |
| | | String commandId = com.getId() ; |
| | | if(commandId == null){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,收到命令的命令ID为空!",null, com.getCode())); |
| | | } |
| | | |
| | | String code = com.getCode() ; |
| | | if(code == null){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,收到命令的命令功能码为空!", com.getId(), null)); |
| | | } |
| | | |
| | | if(commandType.equals(CommandType.innerCommand)){ |
| | | //通信中间件内部命令,例如查询监控中间件时钟,查询RTU在线情况等 |
| | | try{ |
| | | Command reCom = new CommandInnerDeaLer().deal(com) ; |
| | | /* |
| | | boolean error = false ; |
| | | if(reCom.param != null && reCom.param != null){ |
| | | CommandBackParam cbp = (CommandBackParam)reCom.param ; |
| | | if(cbp.getSuccess() != null && !cbp.getSuccess().booleanValue()){ |
| | | error = true ; |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored(cbp.getMessage(), com.getId(), null)); |
| | | } |
| | | } |
| | | if(!error){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored(cbp.getMessage(), com.getId(), null)); |
| | | } |
| | | */ |
| | | return BaseResponseUtils.buildSuccess(reCom); |
| | | }catch(Exception e){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("处理内部命令出错" + (e.getMessage() == null?"":("," + e.getMessage())), com.getId(), com.getCode()) ); |
| | | } |
| | | |
| | | }else if(commandType.equals(CommandType.outerCommand)){ |
| | | //发向RTU的外部命令,异步处理,web端jroups成员同步得到命令处理结果,但构造命令及下发命令和命令结果接收要异步得到 |
| | | try{ |
| | | return this.dealOuterCommand(com) ; |
| | | }catch(Exception e){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("处理发向RTU的外部命令出错" + (e.getMessage() == null?"":("," + e.getMessage())), com.getId(), com.getCode()) ); |
| | | } |
| | | }else if(commandType.equals(CommandType.resultCommand)){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,通信中间件不接结果类型的命令!", com.getId(), com.getCode())); |
| | | }else{ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,收到命令的命令功能码为空!", com.getId(), com.getCode())); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 处理发向RTU的外部命令 |
| | | * @return 结果 |
| | | */ |
| | | private BaseResponse<Command> dealOuterCommand(Command command){ |
| | | String rtuAddr = command.getRtuAddr() ; |
| | | if(rtuAddr == null || rtuAddr.trim().equals("")){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,RTU地址为空!", command.getId(), command.getCode())) ; |
| | | } |
| | | rtuAddr = rtuAddr.trim() ; |
| | | Boolean onLine = TcpSessionCache.isConnect(rtuAddr); |
| | | if(onLine == null){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,RTU(地址=" + rtuAddr + ")未上线!", command.getId(), command.getCode())) ; |
| | | }else if(!onLine.booleanValue()){ |
| | | return BaseResponseUtils.buildError(ReturnCommand.errored("出错,RTU(地址=" + rtuAddr + ")离线!", command.getId(), command.getCode())) ; |
| | | } |
| | | |
| | | //生成异步任务 |
| | | RtuDownTask task = new RtuDownTask() ; |
| | | task.data = command ; |
| | | try{ |
| | | log.info("构造下发远程命令" + command.getCode() + "的核心任务,并放入任务队列中"); |
| | | CoreUnit.getInstance().pushCoreTask(task); |
| | | }catch(Exception e){ |
| | | log.error(e.getMessage(), e); |
| | | return BaseResponseUtils.buildError(ReturnCommand.successed("命令处理失败" + e.getMessage(), command.getId(), command.getCode())) ; |
| | | } |
| | | |
| | | return BaseResponseUtils.buildSuccess(ReturnCommand.successed("命令已接受,即将构造并下发命令。", command.getId(), command.getCode())); |
| | | } |
| | | |
| | | /** |
| | | * 收到命令结果 |
| | | * @param command |
| | | private void dealCommandResult(String jgSenderName, Command command){ |
| | | Object obj = command.getParam() ; |
| | | if(obj != null){ |
| | | CommandBackParam p = (CommandBackParam)obj ; |
| | | if(p.getSuccess()){ |
| | | log.info("命令" + (command.getId().equals(Command.defaultId)?"":("(id=" + command.getId() + ")")) + "执行成功" |
| | | + (p.getMessage() == null?"":(p.getMessage().equals("")?"":("," + p.getMessage())))); |
| | | }else{ |
| | | log.error("命令" + (command.getId().equals(Command.defaultId)?"":("(id=" + command.getId() + ")")) + "执行失败" |
| | | + (p.getMessage() == null?"":(p.getMessage().equals("")?"":("," + p.getMessage())))); |
| | | } |
| | | } |
| | | } |
| | | */ |
| | | } |