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<AgvPackage> {
|
|
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_PATH_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;
|
}
|
}
|
|
|
|
|
}
|