| 
					
				 | 
			
			
				@@ -2,6 +2,7 @@ package com.ruoyi.sim.service.impl; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.common.core.domain.AjaxResult; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.sim.config.SimConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import com.ruoyi.sim.config.SimDebugConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.sim.domain.Seat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.sim.domain.vo.SimSocketParamVo; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import com.ruoyi.sim.domain.vo.SocketWrapCacheVo; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -12,6 +13,7 @@ import org.springframework.security.core.parameters.P; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.stereotype.Service; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.io.IOException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.net.InetAddress; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.net.Socket; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.HashMap; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.List; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -36,7 +38,7 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 孙总办公室域名 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * nas.yichiot.com 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public static final String IP_TEST = "221.218.213.170"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public static final String IP_TEST = "221.218.215.73"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public static final int PORT_TEST = 8899; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -57,6 +59,12 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * value: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private static HashMap<String, SocketWrapCacheVo> cachedMap = new HashMap<>(INIT_SIZE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 每个Socket都有。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 重试次数。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * default 0. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static HashMap<String, AtomicInteger> failedMap = new HashMap<>(INIT_SIZE); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     @Autowired 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     private SimConfig config; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -116,9 +124,11 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (isNotOk(sspv) || force) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 final String key = sspv.toKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 l.info("openSocket cachedSocket is not ok!try new socket ip = {}:{}!forceNew = {}", sspv.getIp(), sspv.getPort(), force); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                closeOne(sspv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                // todo: LOCAL_PORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                closeOne(sspv, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // 不指定本地端口实现。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 Socket s = new Socket(sspv.getIp(), sspv.getPort()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // todo: LOCAL_PORT 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // Socket s = new Socket(sspv.getIp(), sspv.getPort(), InetAddress.getLocalHost(), SimDebugConfig.TCP_LOCAL_PORT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 s.setSoTimeout(SOCKET_TIME_OUT); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 SocketWrapCacheVo value = new SocketWrapCacheVo(sspv.getIp(), sspv.getPort(), s, System.currentTimeMillis()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                 cachedMap.put(key, value); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -147,6 +157,14 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public AjaxResult tryOpenOne(final SimSocketParamVo sspv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!config.isCommGlobal()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            l.warn("isCommGlobal == {} [模拟器通信被禁用!]", config.isCommGlobal()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.error("模拟器通信被禁用!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return openOne(sspv, false); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * todo:部分返回Aj结果。 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      * 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -165,12 +183,11 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return AjaxResult.success("所有Socket,创建成功!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public AjaxResult closeOne(final SimSocketParamVo sspv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public AjaxResult closeOne(final SimSocketParamVo sspv, boolean failedReset) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (!config.isCommGlobal()) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             l.warn("isCommGlobal == {} [模拟器通信被禁用!]", config.isCommGlobal()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return AjaxResult.error("模拟器通信被禁用!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        String msgOk = "关闭Socket成功!"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         final String key = sspv.toKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             if (cachedMap.containsKey(key)) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -182,10 +199,12 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } catch (IOException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             e.printStackTrace(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } finally { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            // failed count reset. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            failedReset0(sspv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            if (failedReset) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // failed count reset. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                failedReset0(sspv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             cachedMap.remove(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return AjaxResult.success(msgOk); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return AjaxResult.success("关闭Socket成功!"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -197,7 +216,7 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         final String msgOk = "关闭所有Socket成功!"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         List<Seat> allSeat = seatService.listAllEnable(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         for (Seat s : allSeat) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            closeOne(new SimSocketParamVo(s.getSeatRs485Ip(), s.getSeatRs485Port())); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            closeOne(new SimSocketParamVo(s.getSeatRs485Ip(), s.getSeatRs485Port()), true); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         return AjaxResult.success(msgOk); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -244,23 +263,23 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public boolean failedIsReachedMax(final SimSocketParamVo sspv, final int limit) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         final String key = sspv.toKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return (cachedMap.containsKey(key) && cachedMap.get(key).getFailedCount().get() >= limit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return (failedMap.containsKey(key) && failedMap.get(key).get() >= limit); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public int failedPlus1(final SimSocketParamVo sspv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         final String key = sspv.toKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (!cachedMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            cachedMap.get(key).setFailedCount(new AtomicInteger(SOCKET_FAILED_COUNT_ADD_1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (!failedMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            failedMap.put(key, new AtomicInteger(SOCKET_FAILED_COUNT_ADD_1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            cachedMap.get(key).getFailedCount().addAndGet(SOCKET_FAILED_COUNT_ADD_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            failedMap.get(key).addAndGet(SOCKET_FAILED_COUNT_ADD_1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        return cachedMap.get(key).getFailedCount().get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return failedMap.get(key).get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public int failedGet(final SimSocketParamVo sspv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         final String key = sspv.toKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (cachedMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return cachedMap.get(key).getFailedCount().get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (failedMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return failedMap.get(key).get(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             return SOCKET_FAILED_COUNT_0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -268,8 +287,8 @@ public class SocketService { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     public void failedReset0(final SimSocketParamVo sspv) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         final String key = sspv.toKey(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (cachedMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            cachedMap.get(key).getFailedCount().set(SOCKET_FAILED_COUNT_0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (failedMap.containsKey(key)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            failedMap.get(key).set(SOCKET_FAILED_COUNT_0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             l.debug("not containsKey SimSocketParamVo sspv:" + sspv); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 |