dacoo-data-sdk-yongfeng/src/main/java/com/cisdi/data/RFID/gateway/RfidClientHandler.java

111 lines
4.2 KiB
Java
Raw Normal View History

2024-09-04 14:38:10 +08:00
package com.cisdi.data.RFID.gateway;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.cisdi.data.sdk.consts.ServiceName;
import com.cisdi.data.sdk.gateway.message.SocketMessage;
import com.cisdi.data.sdk.service.SendService;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.util.ReferenceCountUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.charset.Charset;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class RfidClientHandler extends SimpleChannelInboundHandler<ByteBuf> {
private static final Logger logger = LoggerFactory.getLogger(RfidClientHandler.class);
private static final Charset Encode_Charset = Charset.forName("UTF-8");
private static final String HEARTBEAT_CODE = "HeartBea";
private RfidClient rfidClient;
private RfidTaskStartVo startVo;
public RfidClientHandler(RfidTaskStartVo startVo, RfidClient rfidClient) {
this.startVo = startVo;
this.rfidClient = rfidClient;
}
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
try {
List<RfidItemVo> decode = RfidVoDecoder.Decode(msg);
if(decode.size() == 1 && HEARTBEAT_CODE.equalsIgnoreCase(decode.get(0).getCode())) {
logger.info("永锋物流Rfid {},启用心跳:{} 心跳 vo:{}", rfidClient.getChannel(),
startVo.getCustomParam() == null ? false : startVo.getCustomParam().getEnableHeartbeat(),
decode);
rfidClient.setLastHeartbeatTime(System.currentTimeMillis());
return;
}
decode.forEach((RfidItemVo i) -> {
i.setServerIp(startVo.getSocketParam().getPeerIp());
i.setServerPort(startVo.getSocketParam().getPeerPort());
});
if (startVo.getGatewayBase() != null && Boolean.TRUE.equals(startVo.getGatewayBase().getInstanceVo().getLogOpen())) {
logger.info("永锋物流Rfid {} vo:{} ", rfidClient.getChannel(), decode);
}
if (startVo.getGatewayBase() != null && startVo.getServiceProvider() != null) {
Map<String, Object> data = new HashMap<>();
SendService service = (SendService) startVo.getServiceProvider().getByName(ServiceName.Send);
SocketMessage socketMessage = startVo.getGatewayBase().buildSocketMessage();
socketMessage.setDeviceId(startVo.getDeviceId());
socketMessage.setProviderCode(null);
socketMessage.setMsgKey("666");
data.put("data", decode);
String jsonString = JSON.toJSONString(data, SerializerFeature.WriteMapNullValue);
byte[] body = jsonString.getBytes(Encode_Charset);
socketMessage.setData(body);
logger.info("socketMess" + socketMessage.toString());
service.sendMessage(socketMessage);
} else {
logger.info("永锋物流Rfid收到消息{}", decode);
}
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
}
}
@Override
public void channelActive(ChannelHandlerContext ctx) throws Exception {
logger.info("{} channelActive active", ctx.channel());
}
@Override
public void channelInactive(ChannelHandlerContext ctx) throws Exception {
logger.info("{} channelInactive inactive", ctx.channel());
try {
rfidClient.setChannel(null);
logger.info("set channel to null raise reconnect");
} finally {
// 释放引用
rfidClient = null;
}
super.channelInactive(ctx);
}
@Override
public void exceptionCaught(ChannelHandlerContext ctx, Throwable t) throws Exception {
logger.error("exceptionCaught:{}", t);
super.exceptionCaught(ctx, t);
}
@Override
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
logger.error("userEventTriggered:{}", evt);
super.userEventTriggered(ctx, evt);
}
}