hecheng 3 rokov pred
rodič
commit
f32b1479b3

+ 27 - 21
zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDListenerServiceImpl.java

@@ -30,7 +30,7 @@ public class DeJuRFIDListenerServiceImpl implements IService {
     @Resource
     private RemoteLaboratoryService remoteLaboratoryService;
     @Resource
-    private DeJuRFIDServiceImpl deJuRFIDService;
+    private DeJuRFIDServiceImpl service;
 
     @Override
     public void start(RemoteLabHardware hardware) {
@@ -47,8 +47,8 @@ public class DeJuRFIDListenerServiceImpl implements IService {
             serverMap.put(ipAddress, server);
         }
         if (server.open(DeJuRFIDServiceImpl.PORT)) {
-            subscribeServerHandler(server, hardware);
             log.info("开始监听");
+            subscribeServerHandler(server, hardware);
         } else {
             log.info("监听失败");
             throw new ServiceException("监听失败,请稍后进行设备重连。。。");
@@ -69,7 +69,7 @@ public class DeJuRFIDListenerServiceImpl implements IService {
 
     @Override
     public void alarm(RemoteLabHardware hardware) {
-        deJuRFIDService.alarm(hardware);
+        service.alarm(hardware);
     }
 
     /**
@@ -83,32 +83,38 @@ public class DeJuRFIDListenerServiceImpl implements IService {
             client.setSendHeartBeat(true);//开启心跳检测Tcp连接状态
             client.setPrint(true);
             subscribeTcpHandler(client, hardware);//订阅Tcp断连上报
-            MsgBaseSetBaseband msgBaseSetBaseband = DeJuRFIDServiceImpl.setSession(hardware, client);
-            if (0 != msgBaseSetBaseband.getRtCode()) {
-                log.error("Session configuration error.");
-                restart(hardware);
-            }
-            MsgBaseSetPower msgBaseSetPower = DeJuRFIDServiceImpl.setPower(hardware, client);
-            if (0 != msgBaseSetPower.getRtCode()) {
-                log.error("Power configuration error.");
-                restart(hardware);
-            }
-            MsgBaseInventoryEpc msgBaseInventoryEpc = DeJuRFIDServiceImpl.setInventory(hardware, client);
-            if (0 != msgBaseInventoryEpc.getRtCode()) {
-                log.error("Inventory epc error.");
-                restart(hardware);
-            }
+
+            reSet(hardware, client);
             DeJuRFIDServiceImpl.subscribeHandler(client, hardware);
             remoteLaboratoryService.update(HardwareOperate.OPEN, hardware.getIpAddress());
             log.info(client.getName() + "---监听成功");
         };
     }
 
-    private void restart(RemoteLabHardware hardware){
-        disconnect(hardware);
-        start(hardware);
+    private void reSet(RemoteLabHardware hardware, GClient client) {
+        MsgBaseSetPower msgBaseSetPower = DeJuRFIDServiceImpl.setPower(hardware, client);
+        if (0 != msgBaseSetPower.getRtCode()) {
+            log.error("Power configuration error.");
+            reConnect(hardware,client);
+            return;
+        }
+        MsgBaseInventoryEpc msgBaseInventoryEpc = DeJuRFIDServiceImpl.setInventory(hardware, client);
+        if (0 != msgBaseInventoryEpc.getRtCode()) {
+            log.error("Inventory epc error.");
+            reConnect(hardware,client);
+            return;
+        }
+        MsgBaseSetBaseband msgBaseSetBaseband = DeJuRFIDServiceImpl.setSession(hardware, client);
+        if (0 != msgBaseSetBaseband.getRtCode()) {
+            log.error("Session configuration error.");
+            reConnect(hardware,client);
+        }
     }
 
+    private void reConnect(RemoteLabHardware hardware,GClient client){
+        DeJuRFIDServiceImpl.stopMsg(client);
+        reSet(hardware,client);
+    }
 
     /**
      * 订阅TCP断开连接上报

+ 29 - 13
zd-modules/zd-netty/src/main/java/com/zd/netty/sdk/DeJuRFIDServiceImpl.java

@@ -18,6 +18,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 
 /**
  * @author Administrator
@@ -31,12 +32,15 @@ public class DeJuRFIDServiceImpl implements IService {
     private static final Map<String, GClient> CLIENT_MAP = new ConcurrentHashMap<>();
 
     static AtomicBoolean isAlarm = new AtomicBoolean();
+    static AtomicInteger stopCount = new AtomicInteger();
 
     public static final Integer PORT = 8160;
 
     private static final String HTTP_SEPARATOR = ":";
     private static final Integer TIME_OUT = 2000;
 
+    private static final Integer MAX_RETRY=3;
+
     private static final ScheduledExecutorService scheduledExecutorService = SpringUtils.getBean("scheduledExecutorService");
 
     @Override
@@ -53,7 +57,7 @@ public class DeJuRFIDServiceImpl implements IService {
             client = new GClient();
             CLIENT_MAP.put(ipAddress, client);
         }
-        if (client.openTcp(ipAddress + HTTP_SEPARATOR+ PORT, TIME_OUT)) {
+        if (client.openTcp(ipAddress + HTTP_SEPARATOR + PORT, TIME_OUT)) {
             // 订阅标签上报事件
             subscribeHandler(client, hardware);
             // 功率配置, 将4个天线功率都设置为30dBm.
@@ -104,9 +108,7 @@ public class DeJuRFIDServiceImpl implements IService {
         msgBaseInventoryEpc.setInventoryMode(EnumG.InventoryMode_Inventory);
 
         client.sendSynMsg(msgBaseInventoryEpc);
-        if (0 != msgBaseInventoryEpc.getRtCode()) {
-            log.info("Inventory epc error.");
-        } else {
+        if (0 == msgBaseInventoryEpc.getRtCode()) {
             log.info("Inventory epc success.");
         }
         return msgBaseInventoryEpc;
@@ -119,8 +121,9 @@ public class DeJuRFIDServiceImpl implements IService {
         MsgBaseSetPower msgBaseSetPower = new MsgBaseSetPower();
         if (0 == msgBaseGetPower.getRtCode()) {
             Hashtable<Integer, Integer> dicPower = msgBaseGetPower.getDicPower();
-            Integer integer = dicPower.get(0);
-            if (!Objects.equals(integer, uniformPower)) {
+            Integer power = dicPower.get(1);
+            log.info("输出功率:==============》{}", power);
+            if (power == null || !Objects.equals(power, uniformPower)) {
                 Hashtable<Integer, Integer> hashtable = new Hashtable<>();
                 Integer channels = hardware.getChannels();
                 for (int i = 1; i <= channels; i++) {
@@ -128,9 +131,16 @@ public class DeJuRFIDServiceImpl implements IService {
                 }
                 msgBaseSetPower.setDicPower(hashtable);
                 client.sendSynMsg(msgBaseSetPower);
+                if (0 == msgBaseSetPower.getRtCode()) {
+                    log.info("Power epc success.");
+                } else {
+                    log.info("==============设置输出功率失败==============");
+                }
             } else {
                 msgBaseSetPower.setRtCode((byte) 0);
             }
+        } else {
+            log.info("==============获取输出功率失败==============");
         }
         return msgBaseSetPower;
     }
@@ -191,16 +201,20 @@ public class DeJuRFIDServiceImpl implements IService {
         if (CLIENT_MAP.containsKey(ipAddress)) {
             GClient client = CLIENT_MAP.get(ipAddress);
             changeGpo(0, client, 0);
-            MsgBaseStop msg = new MsgBaseStop();
-            // 停止读卡,空闲态
-            client.sendSynMsg(msg);
-            String result = msg.getRtCode() == 0 ? "成功" : "失败";
-            log.info("客户端停止读卡{}", result);
+            stopMsg(client);
             client.close();
             CLIENT_MAP.remove(ipAddress);
         }
     }
 
+    public static void stopMsg(GClient client) {
+        MsgBaseStop msg = new MsgBaseStop();
+        // 停止读卡,空闲态
+        client.sendSynMsg(msg);
+        String result = msg.getRtCode() == 0 ? "成功" : "失败";
+        log.info("客户端停止读卡{}", result);
+    }
+
     private static void changeGpo(int state, GClient client, int delayTime) {
         MsgAppSetGpo msgAppSetGpo = new MsgAppSetGpo();
         msgAppSetGpo.setGpo1(state);
@@ -218,7 +232,9 @@ public class DeJuRFIDServiceImpl implements IService {
             }
         } else {
             log.error("Gpo epc {} error.", status);
-            stopGpo(client, delayTime);
+            if (stopCount.getAndIncrement() < MAX_RETRY) {
+                stopGpo(client, delayTime);
+            }
         }
     }
 
@@ -242,7 +258,7 @@ public class DeJuRFIDServiceImpl implements IService {
         CLIENT_MAP.computeIfAbsent(ipAddress, f -> client);
         client.onTagEpcLog = (s, logBaseEpcInfo) -> {
             if (logBaseEpcInfo.getResult() == 0) {
-                log.info("===========》{},index: {}", logBaseEpcInfo.getEpc(),logBaseEpcInfo.getAntId());
+                log.info("===========》{},index: {}", logBaseEpcInfo.getEpc(), logBaseEpcInfo.getAntId());
                 InventoryTag tag = new InventoryTag();
                 BeanUtils.copyProperties(logBaseEpcInfo, tag);
                 tag.setRemoteLabHardware(hardware);