|
|
@@ -2,57 +2,33 @@ package com.zd.netty.sdk;
|
|
|
|
|
|
import com.gg.reader.api.dal.GClient;
|
|
|
import com.gg.reader.api.dal.GServer;
|
|
|
-import com.gg.reader.api.protocol.gx.*;
|
|
|
-import com.zd.common.core.utils.SpringUtils;
|
|
|
-import com.zd.netty.service.ISendService;
|
|
|
+import com.gg.reader.api.protocol.gx.MsgBaseStop;
|
|
|
import com.zd.netty.service.IService;
|
|
|
-import com.zd.system.api.domain.InventoryTag;
|
|
|
import com.zd.system.api.laboratory.domain.RemoteLabHardware;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
-import org.springframework.beans.BeanUtils;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
-import javax.annotation.Resource;
|
|
|
-import java.util.Hashtable;
|
|
|
import java.util.Map;
|
|
|
-import java.util.Objects;
|
|
|
-import java.util.TimerTask;
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
-import java.util.concurrent.ScheduledExecutorService;
|
|
|
-import java.util.concurrent.TimeUnit;
|
|
|
-import java.util.concurrent.atomic.AtomicBoolean;
|
|
|
|
|
|
|
|
|
@Slf4j
|
|
|
@Service
|
|
|
public class DeJuRFIDListenerService implements IService {
|
|
|
|
|
|
- @Resource
|
|
|
- private ISendService sendService;
|
|
|
-
|
|
|
- private final Map<String, GClient> clientMap = new ConcurrentHashMap<>();
|
|
|
-
|
|
|
- AtomicBoolean isAlarm = new AtomicBoolean();
|
|
|
-
|
|
|
- GClient client;
|
|
|
-
|
|
|
- private final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
|
|
|
+ private final Map<String, GServer> serverMap = new ConcurrentHashMap<>();
|
|
|
|
|
|
@Override
|
|
|
public void start(RemoteLabHardware hardware) {
|
|
|
String ipAddress = hardware.getIpAddress();
|
|
|
- if (clientMap.containsKey(ipAddress)){
|
|
|
- return;
|
|
|
+ GServer server;
|
|
|
+ if (serverMap.containsKey(ipAddress)) {
|
|
|
+ server = serverMap.get(ipAddress);
|
|
|
+ } else {
|
|
|
+ server = new GServer();
|
|
|
}
|
|
|
- GServer server = new GServer();
|
|
|
- if (server.open(9190)) {
|
|
|
- subscribeServerHandler(server);
|
|
|
- if (client!=null){
|
|
|
- clientMap.put(ipAddress,client);
|
|
|
- setPower(hardware);
|
|
|
- setInventory(hardware);
|
|
|
- subscribeHandler(client);
|
|
|
- }
|
|
|
+ if (server.open(DeJuRFIDService.PORT)) {
|
|
|
+ subscribeServerHandler(server, hardware);
|
|
|
log.info("开始监听");
|
|
|
} else {
|
|
|
log.info("监听失败");
|
|
|
@@ -61,31 +37,36 @@ public class DeJuRFIDListenerService implements IService {
|
|
|
|
|
|
@Override
|
|
|
public void disconnect(RemoteLabHardware hardware) {
|
|
|
- stop();
|
|
|
- clientMap.remove(hardware.getIpAddress());
|
|
|
+ String ipAddress = hardware.getIpAddress();
|
|
|
+ if (serverMap.containsKey(ipAddress)) {
|
|
|
+ GServer server = serverMap.get(ipAddress);
|
|
|
+ server.close();
|
|
|
+ }
|
|
|
+ serverMap.remove(hardware.getIpAddress());
|
|
|
}
|
|
|
|
|
|
//订阅监听上报
|
|
|
- private void subscribeServerHandler(GServer server) {
|
|
|
- server.onGClientConnected = (gClient, serialNumber) -> {
|
|
|
- log.info(gClient.getName() + "---监听成功");
|
|
|
- client = gClient;//切换连接对象
|
|
|
+ private void subscribeServerHandler(GServer server, RemoteLabHardware hardware) {
|
|
|
+ server.onGClientConnected = (client, serialNumber) -> {
|
|
|
+ log.info(client.getName() + "---监听成功");
|
|
|
client.setSendHeartBeat(true);//开启心跳检测Tcp连接状态
|
|
|
client.setPrint(true);
|
|
|
- subscribeTcpHandler();//订阅Tcp断连上报
|
|
|
- stop();//测试监听成功的连接是否通信正常
|
|
|
+ subscribeTcpHandler(client);//订阅Tcp断连上报
|
|
|
+ DeJuRFIDService.setPower(hardware, client);
|
|
|
+ DeJuRFIDService.setInventory(hardware, client);
|
|
|
+ DeJuRFIDService.subscribeHandler(client);
|
|
|
};
|
|
|
}
|
|
|
|
|
|
//订阅TCP断开连接上报
|
|
|
- private void subscribeTcpHandler() {
|
|
|
+ private void subscribeTcpHandler(GClient client) {
|
|
|
client.onDisconnected = s -> {
|
|
|
log.info("连接" + s + "已断开");
|
|
|
client.close();//释放当前连接资源
|
|
|
};
|
|
|
}
|
|
|
|
|
|
- private void stop() {
|
|
|
+ private void stop(GClient client) {
|
|
|
MsgBaseStop msg = new MsgBaseStop();
|
|
|
client.sendSynMsg(msg);
|
|
|
if (0x00 == msg.getRtCode()) {
|
|
|
@@ -94,127 +75,4 @@ public class DeJuRFIDListenerService implements IService {
|
|
|
log.info(msg.getRtMsg());
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- /**
|
|
|
- * 订阅6c标签信息上报
|
|
|
- *
|
|
|
- * @param client 客户端
|
|
|
- */
|
|
|
- private void subscribeHandler(GClient client) {
|
|
|
- client.onTagEpcLog = (s, logBaseEpcInfo) -> {
|
|
|
- if (logBaseEpcInfo.getResult() == 0) {
|
|
|
- log.info("===========》{}", logBaseEpcInfo.getbEpc());
|
|
|
- //灯带设置
|
|
|
- if (!isAlarm.get()) {
|
|
|
- scheduledExecutorService.execute(() -> {
|
|
|
- isAlarm.set(true);
|
|
|
- changeGpo(1, client, 10);
|
|
|
- });
|
|
|
- }
|
|
|
- InventoryTag tag = new InventoryTag();
|
|
|
- BeanUtils.copyProperties(logBaseEpcInfo, tag);
|
|
|
- sendService.send(tag);
|
|
|
- }
|
|
|
- };
|
|
|
- client.onTagEpcOver = (s, logBaseEpcOver) -> log.info("HandlerTagEpcOver");
|
|
|
- }
|
|
|
-
|
|
|
- private void changeGpo(int state, GClient client, int delayTime) {
|
|
|
- MsgAppSetGpo msgAppSetGpo = new MsgAppSetGpo();
|
|
|
- msgAppSetGpo.setGpo1(state);
|
|
|
- msgAppSetGpo.setGpo2(state);
|
|
|
-
|
|
|
- client.sendSynMsg(msgAppSetGpo);
|
|
|
- String status = state == 1 ? "start" : "stop";
|
|
|
- if (0 == msgAppSetGpo.getRtCode()) {
|
|
|
- if (state == 1) {
|
|
|
- stopGpo(client, delayTime);
|
|
|
- } else {
|
|
|
- isAlarm.set(false);
|
|
|
- }
|
|
|
- } else {
|
|
|
- log.error("Gpo epc {} error.", status);
|
|
|
- if (state == 1) {
|
|
|
- stopGpo(client, delayTime);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void stopGpo(GClient client, int delayTime) {
|
|
|
- scheduledExecutorService.schedule(new TimerTask() {
|
|
|
- @Override
|
|
|
- public void run() {
|
|
|
- changeGpo(0, client, 0);
|
|
|
- }
|
|
|
- }, delayTime, TimeUnit.SECONDS);
|
|
|
- }
|
|
|
-
|
|
|
- private void setPower(RemoteLabHardware hardware){
|
|
|
- // 功率配置, 将4个天线功率都设置为30dBm.
|
|
|
- Integer uniformPower = hardware.getUniformPower();
|
|
|
- MsgBaseGetPower msgBaseGetPower = new MsgBaseGetPower();
|
|
|
- client.sendSynMsg(msgBaseGetPower);
|
|
|
- if (0 == msgBaseGetPower.getRtCode()) {
|
|
|
- Hashtable<Integer, Integer> dicPower = msgBaseGetPower.getDicPower();
|
|
|
- Integer integer = dicPower.get(0);
|
|
|
- if (!Objects.equals(integer, uniformPower)) {
|
|
|
- MsgBaseSetPower msgBaseSetPower = new MsgBaseSetPower();
|
|
|
- Hashtable<Integer, Integer> hashtable = new Hashtable<>();
|
|
|
-
|
|
|
- Integer channels = hardware.getChannels();
|
|
|
- for (int i = 1; i <= channels; i++) {
|
|
|
- hashtable.put(i, uniformPower);
|
|
|
- }
|
|
|
- msgBaseSetPower.setDicPower(hashtable);
|
|
|
- client.sendSynMsg(msgBaseSetPower);
|
|
|
- if (0 != msgBaseSetPower.getRtCode()) {
|
|
|
- log.error("Power configuration error.");
|
|
|
- reset(client);
|
|
|
- disconnect(hardware);
|
|
|
- start(hardware);
|
|
|
- }
|
|
|
- }
|
|
|
- } else {
|
|
|
- log.error("Power configuration error.");
|
|
|
- reset(client);
|
|
|
- disconnect(hardware);
|
|
|
- start(hardware);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- private void setInventory(RemoteLabHardware hardware){
|
|
|
- //天线读卡, 读取EPC数据区以及TID数据区
|
|
|
- MsgBaseInventoryEpc msgBaseInventoryEpc = new MsgBaseInventoryEpc();
|
|
|
- switch (hardware.getChannels()) {
|
|
|
- case 4:
|
|
|
- msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4);
|
|
|
- break;
|
|
|
- case 8:
|
|
|
- msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4 | EnumG.AntennaNo_5 | EnumG.AntennaNo_6 | EnumG.AntennaNo_7 | EnumG.AntennaNo_8);
|
|
|
- break;
|
|
|
- case 16:
|
|
|
- msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1 | EnumG.AntennaNo_2 | EnumG.AntennaNo_3 | EnumG.AntennaNo_4 | EnumG.AntennaNo_5 | EnumG.AntennaNo_6 | EnumG.AntennaNo_7 | EnumG.AntennaNo_8 | EnumG.AntennaNo_9 | EnumG.AntennaNo_10 | EnumG.AntennaNo_11 | EnumG.AntennaNo_12 | EnumG.AntennaNo_13 | EnumG.AntennaNo_14 | EnumG.AntennaNo_15 | EnumG.AntennaNo_16);
|
|
|
- break;
|
|
|
- case 1:
|
|
|
- default:
|
|
|
- msgBaseInventoryEpc.setAntennaEnable(EnumG.AntennaNo_1);
|
|
|
- }
|
|
|
- msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory);
|
|
|
-
|
|
|
- client.sendSynMsg(msgBaseInventoryEpc);
|
|
|
- if (0 != msgBaseInventoryEpc.getRtCode()) {
|
|
|
- log.error("Inventory epc error.");
|
|
|
- reset(client);
|
|
|
- disconnect(hardware);
|
|
|
- start(hardware);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- public void reset(GClient client) {
|
|
|
- MsgAppReset msgAppReset = new MsgAppReset();
|
|
|
- client.sendSynMsg(msgAppReset);
|
|
|
- if (0 != msgAppReset.getRtCode()) {
|
|
|
- log.error("Reset epc error.");
|
|
|
- }
|
|
|
- }
|
|
|
}
|