package com.zy.acs.gateway.handler; import com.zy.acs.common.constant.RedisConstant; import com.zy.acs.common.domain.AgvProtocol; import com.zy.acs.common.domain.protocol.*; import com.zy.acs.common.utils.RedisSupport; import com.zy.acs.gateway.AbstractInboundHandler; import com.zy.acs.gateway.Executors; import com.zy.acs.gateway.constant.ProtocolType; import com.zy.acs.gateway.domain.AgvPackage; import com.zy.acs.gateway.process.AckMsgBuilder; import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; /** * 业务处理 handler * Created by vincent on 2019-04-02 */ @Component("gbPackageServerHandler") @ChannelHandler.Sharable public class AgvPackageServerHandler extends AbstractInboundHandler { private static final Logger log = LoggerFactory.getLogger(AgvPackageServerHandler.class); private final RedisSupport redis = RedisSupport.defaultRedisSupport; @Autowired private Executors executors; @Override @SuppressWarnings("all") protected boolean channelRead0(ChannelHandlerContext ctx, AgvPackage pac) throws Exception { // ack ProtocolType ackType = isNeedAck(pac); final String uniqueNo = pac.getHeader().getUniqueNo(); label : switch (pac.getHeader().getProtocolType()){ case PATH_ACK: // 路径包 ack AGV_01_UP agv_01_up = (AGV_01_UP) pac.getBody().getMessageBody(); redis.setObject(RedisConstant.AGV_CMD_UP_FLAG , pac.getHeader().getUniqueNo() + "_" + agv_01_up.getSerialNo() , agv_01_up); break label; case COMMAND_ACK: // 命令包 ack AGV_02_UP agv_02_up = (AGV_02_UP) pac.getBody().getMessageBody(); redis.setObject(RedisConstant.AGV_CMD_UP_FLAG , pac.getHeader().getUniqueNo() + "_" + agv_02_up.getSerialNo() , agv_02_up); break label; case ACTION_COMPLETE: // 动作完成数据包 AGV_11_UP agv_11_up = (AGV_11_UP) pac.getBody().getMessageBody(); redis.push(RedisConstant.AGV_COMPLETE_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_11_up)); // 动作完成应答 if (null != ackType) { AgvPackage ackPac = AckMsgBuilder.ofSuccess(pac, ackType); AGV_A1_DOWN agv_a1_down = (AGV_A1_DOWN) ackPac.getBody().getMessageBody(); agv_a1_down.setAckSign((byte) agv_11_up.getCompleteCode()); ctx.writeAndFlush(ackPac); } break label; case DATA_CODE_REPORT: // 有码实时数据 AGV_12_UP agv_12_up = (AGV_12_UP) pac.getBody().getMessageBody(); redis.push(RedisConstant.AGV_DATA_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_12_up)); // executors.getInstance().execute(() -> { // // if (agvDataFeignApi.transfer(agv_12_up).fail()) { // log.error("agvDataFeignApi.transfer(agv_12_up) fail!\n{}", JSON.toJSON(agv_12_up)); // } // // }); break label; case DATA_WITHOUT_CODE_REPORT: // 无码实时数据 AGV_13_UP agv_13_up = (AGV_13_UP) pac.getBody().getMessageBody(); redis.push(RedisConstant.AGV_DATA_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_13_up)); // executors.getInstance().execute(() -> { // // if (agvDataFeignApi.transfer(agv_13_up).fail()) { // log.error("agvDataFeignApi.transfer(agv_13_up) fail!\n{}", JSON.toJSON(agv_13_up)); // } // // }); break label; case HEARTBEAT_REPORT: // 心跳 // 30s redis redis.setObject(RedisConstant.AGV_ONLINE_FLAG, pac.getHeader().getUniqueNo(), 1, 30); AGV_03_UP agv_03_up = (AGV_03_UP) pac.getBody().getMessageBody(); redis.push(RedisConstant.AGV_DATA_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_03_up)); // executors.getInstance().execute(() -> { // // if (agvDataFeignApi.transfer(agv_03_up).fail()) { // log.error("agvDataFeignApi.transfer(agv_03_up) fail!\n{}", JSON.toJSON(agv_03_up)); // } // if (agvDataFeignApi.transfer(AgvProtocol.build().setAgvNo(uniqueNo).setMessageBody(agv_03_up)).fail()) { // log.error("agvDataFeignApi.transfer(agv_03_up) fail!\n{}", JSON.toJSON(agv_03_up)); // } // // }); break label; case SILO_REPORT: // 料仓信息包 AGV_70_UP agv_70_up = (AGV_70_UP) pac.getBody().getMessageBody(); redis.push(RedisConstant.AGV_COMPLETE_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_70_up)); // executors.getInstance().execute(() -> { // // if (agvDataFeignApi.transfer(agv_70_up).fail()) { // log.error("agvDataFeignApi.transfer(agv_70_up) fail!\n{}", JSON.toJSON(agv_70_up)); // } // // }); break label; case LOGIN_REPORT: // 登录 AGV_F0_UP agv_f0_up = (AGV_F0_UP) pac.getBody().getMessageBody(); redis.push(RedisConstant.AGV_DATA_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_f0_up)); // 登录应答 if (null != ackType) { AgvPackage ackPac = AckMsgBuilder.ofSuccess(pac, ackType); ctx.writeAndFlush(ackPac); } // 30s redis redis.setObject(RedisConstant.AGV_ONLINE_FLAG, pac.getHeader().getUniqueNo(), 1, 30); break label; case FAULT_REPORT: // 故障数据包 AGV_04_UP agv_04_up = (AGV_04_UP) pac.getBody().getMessageBody(); redis.push(RedisConstant.AGV_DATA_FLAG, AgvProtocol.build(uniqueNo).setMessageBody(agv_04_up)); break label; default: break label; } return true; } /** * 服务器是否需要应答 */ public static ProtocolType isNeedAck(AgvPackage pac) { switch (pac.getHeader().getProtocolType()) { case ACTION_COMPLETE: return ProtocolType.ACTION_SUCCESS_ACK; case LOGIN_REPORT: return ProtocolType.LOGIN_ACK; default: return null; } } }