dacoo-data-sdk-yongfeng/src/main/java/com/cisdi/data/RFID/gateway/RfidClientHandler.java
2024-09-04 14:38:10 +08:00

111 lines
4.2 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}