From 01ba9dad3e284f390224151b510894a776ec4267 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期一, 17 十一月 2025 08:14:32 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java | 209 ++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 152 insertions(+), 57 deletions(-)
diff --git a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
index e1ce5cf..812cfc3 100644
--- a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
+++ b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -42,6 +42,7 @@
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
+import java.net.InetAddress;
import java.net.Socket;
import java.text.MessageFormat;
import java.util.*;
@@ -54,9 +55,11 @@
private RedisUtil redisUtil;
private ShuttleProtocol shuttleProtocol;
private Socket socket;
+ private long lastConnectTime = System.currentTimeMillis();
private static final boolean DEBUG = false;//璋冭瘯妯″紡
+ private List<JSONObject> socketReadResults = new ArrayList<>();
private List<JSONObject> socketResults = new ArrayList<>();
//鍘熷璁惧鏁版嵁
@@ -77,6 +80,7 @@
while (true) {
try {
listenSocketMessage();
+ listenInit();//鐩戝惉鍒濆鍖栦簨浠�
} catch (Exception e) {
e.printStackTrace();
}
@@ -89,7 +93,7 @@
while (true) {
try {
read();
- Thread.sleep(200);
+ Thread.sleep(50);
} catch (Exception e) {
log.error("ShuttleThread Fail", e);
}
@@ -135,7 +139,6 @@
Thread otherThread = new Thread(() -> {
while (true) {
try {
- listenInit();//鐩戝惉鍒濆鍖栦簨浠�
saveLog();//淇濆瓨鏁版嵁
} catch (Exception e) {
e.printStackTrace();
@@ -158,6 +161,12 @@
if (deviceDataLogService == null) {
return;
}
+
+ //绂荤嚎涓嶅仛鏃ュ織瀛樺偍
+ if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE)) {
+ return;
+ }
+
DeviceDataLog deviceDataLog = new DeviceDataLog();
deviceDataLog.setOriginData(JSON.toJSONString(this.originDeviceData));
deviceDataLog.setWcsData(JSON.toJSONString(shuttleProtocol));
@@ -194,6 +203,21 @@
}
JSONObject result = JSON.parseObject(sb.toString());//寰楀埌鍝嶅簲缁撴灉闆�
+
+ String msgType = result.getString("msgType");
+ if ("responseMsg".equals(msgType)) {
+ JSONObject response = result.getJSONObject("response");
+ JSONObject body = response.getJSONObject("body");
+ if (body.containsKey("workingMode")) {
+ //read
+ JSONObject socketReadResult = new JSONObject();
+ socketReadResult.put("body", body);
+ socketReadResult.put("originDeviceData", sb);
+ socketReadResults.add(socketReadResult);
+ return;
+ }
+ }
+
if (!socketResults.isEmpty() && socketResults.size() >= 20) {
socketResults.remove(0);//娓呯悊澶磋妭鐐�
}
@@ -276,11 +300,23 @@
//----------璇诲彇鍥涘悜绌挎杞︾姸鎬�-----------
NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(slave.getId());
- JSONObject data = requestCommand(readStatusCommand);
+ requestCommandAsync(readStatusCommand);//璇锋眰鐘舵��
+
+ if (this.socketReadResults.isEmpty()) {
+ if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) {
+ //鏈�鍚庝竴娆′笂绾挎椂闂磋秴杩�60s锛岃瀹氱绾�
+ this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE);
+ }
+ return;
+ }
+
+ JSONObject socketReadResult = this.socketReadResults.get(0);
+ this.socketReadResults.remove(0);
+ JSONObject data = socketReadResult.getJSONObject("body");
if (data == null) {
if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) {
//鏈�鍚庝竴娆′笂绾挎椂闂磋秴杩�60s锛岃瀹氱绾�
- shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE);
+ this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE);
}
OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
}else {
@@ -337,12 +373,16 @@
shuttleProtocol.setPakMk(true);
}
- if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 0) {
+ if (shuttleProtocol.getProtocolStatusType() == null && shuttleProtocol.getDeviceStatus().intValue() == 1) {
//灏忚溅绌洪棽鐘舵�併�佸皬杞︿换鍔$姸鎬佷负鏈煡锛岃瀹氭浘绂荤嚎杩囷紝闇�瑕佸浣嶆垚绌洪棽
- shuttleProtocol.setProtocolStatusType(ShuttleProtocolStatusType.IDLE);
+ this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
}
- this.originDeviceData = data;
+ if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE) && shuttleProtocol.getDeviceStatus().intValue() == 1) {
+ this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE);
+ }
+
+ this.originDeviceData = socketReadResult.get("originDeviceData");
OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆慬id:{1}] <<<<< 瀹炴椂鏁版嵁鏇存柊鎴愬姛",DateUtils.convert(new Date()), slave.getId()));
}
@@ -383,6 +423,9 @@
String requestType = resultBody.getString("requestType");
Integer requestId = resultHeader.getInteger("requestId");
if (requestType.equals("init")) {
+ removeIdx = i;//姝ゆ暟鎹凡缁忓鐞嗭紝浠庣粨鏋滈泦涓墧闄�
+ socketResults.remove(removeIdx);
+
Integer code = resultBody.getInteger("code");
//灏忚溅澶嶄綅璇锋眰
ShuttleCommand initCommand = getInitCommand(requestId, code);
@@ -390,16 +433,10 @@
NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class);
JSONObject requestResult = requestCommand(httpCommand);
- removeIdx = i;//姝ゆ暟鎹凡缁忓鐞嗭紝浠庣粨鏋滈泦涓墧闄�
-
log.info(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", slave.getId(), code, slave.getIp(), slave.getPort()));
OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戣溅澶嶄綅涓婃姤 ===>> [code:{1}] [ip:{2}] [port:{3}]", slave.getId(), code, slave.getIp(), slave.getPort()));
break;
}
- }
-
- if (removeIdx != -1) {
- socketResults.remove(removeIdx);
}
} catch (Exception e) {
e.printStackTrace();
@@ -696,6 +733,19 @@
}
}
+ //***************鍒ゆ柇鏄惁婊″厖鏍″噯***************
+ Config shuttleMaxPowerVerifyConfig = configService.selectOne(new EntityWrapper<Config>()
+ .eq("code", "shuttleMaxPowerVerify")
+ .eq("status", 1));
+ if (shuttleMaxPowerVerifyConfig != null) {
+ if (shuttleMaxPowerVerifyConfig.getValue().equals("true")) {
+ if (this.shuttleProtocol.getBatteryVoltage() < 5630) {
+ return false;//鐢靛帇涓嶅缁х画鍏呯數
+ }
+ }
+ }
+ //***************鍒ゆ柇鏄惁婊″厖鏍″噯***************
+
if (this.shuttleProtocol.getHasCharge() == null) {
return false;
}
@@ -723,12 +773,21 @@
return false;
}
+ if (this.shuttleProtocol.getMode() == 0) {
+ return true;
+ }
+
+ if (!this.shuttleProtocol.getErrorCode().equals("0")) {
+ return true;
+ }
+
InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend();
- boolean res = this.shuttleProtocol.getMode() == 0
- && !this.shuttleProtocol.getErrorCode().equals("0")
- && extend.getSuspendState() == 1
- ;
- return res;
+
+ if (extend.getSuspendState() == 1) {
+ return true;
+ }
+
+ return false;
}
@Override
@@ -1020,12 +1079,20 @@
@Override
public boolean connect() {
try {
- Socket socket = new Socket(slave.getIp(), slave.getPort());
- socket.setSoTimeout(10000);
- socket.setKeepAlive(true);
- this.socket = socket;
- log.info(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket閾炬帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
- } catch (IOException e) {
+ if (System.currentTimeMillis() - lastConnectTime < 1000 * 10) {
+ return false;
+ }
+
+ InetAddress address = InetAddress.getByName(slave.getIp());
+ if (address.isReachable(10000)) {
+ Socket socket = new Socket(slave.getIp(), slave.getPort());
+ socket.setSoTimeout(10000);
+ socket.setKeepAlive(true);
+ this.socket = socket;
+ this.lastConnectTime = System.currentTimeMillis();
+ log.info(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket閾炬帴鎴愬姛 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
+ }
+ } catch (Exception e) {
OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket閾炬帴澶辫触 ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort()));
return false;
}
@@ -1084,46 +1151,74 @@
//鍙戝嚭璇锋眰
private JSONObject requestCommand(NyShuttleHttpCommand httpCommand) throws IOException {
- if (this.socket == null) {
- return null;
- }
+ try {
+ if (this.socket == null) {
+ return null;
+ }
- //鍘嬬缉鏁版嵁鍖�
- JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand));
- data.remove("nodes");
+ //鍘嬬缉鏁版嵁鍖�
+ JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand));
+ data.remove("nodes");
- // 鑾峰彇杈撳嚭娴�
- OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream());
- writer.write(JSON.toJSONString(data) + "\r\n");
- writer.flush();
+ // 鑾峰彇杈撳嚭娴�
+ OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream());
+ writer.write(JSON.toJSONString(data) + "\r\n");
+ writer.flush();
// System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand));
- String requestType = null;
- String taskId = null;
- try {
- requestType = httpCommand.getRequest().getBody().get("requestType").toString();
- taskId = httpCommand.getRequest().getBody().get("taskId").toString();
- } catch (Exception e) {
+ String requestType = null;
+ String taskId = null;
+ try {
+ requestType = httpCommand.getRequest().getBody().get("requestType").toString();
+ taskId = httpCommand.getRequest().getBody().get("taskId").toString();
+ } catch (Exception e) {
// return null;
- //taskId鍙兘鍙栫┖锛屼笉鎶ラ敊锛屾甯告儏鍐�
+ //taskId鍙兘鍙栫┖锛屼笉鎶ラ敊锛屾甯告儏鍐�
+ }
+
+ // 鑾峰彇鏈嶅姟鍣ㄥ搷搴�
+ // 灏濊瘯10娆�
+ JSONObject result = null;
+ for (int i = 0; i < 10; i++) {
+ result = getRequestBody(requestType, taskId);
+ if (result == null) {
+ try {
+ Thread.sleep(100);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }else {
+ break;
+ }
+ }
+ return result;//杩斿洖Body缁撴灉闆�
+ }catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ private void requestCommandAsync(NyShuttleHttpCommand httpCommand) throws IOException {
+ if (this.socket == null) {
+ return;
}
- // 鑾峰彇鏈嶅姟鍣ㄥ搷搴�
- // 灏濊瘯100娆�
- JSONObject result = null;
- for (int i = 0; i < 100; i++) {
- result = getRequestBody(requestType, taskId);
- if (result == null) {
- try {
- Thread.sleep(100);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }else {
- break;
- }
- }
- return result;//杩斿洖Body缁撴灉闆�
+ try {
+ //鍘嬬缉鏁版嵁鍖�
+ JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand));
+ data.remove("nodes");
+
+ // 鑾峰彇杈撳嚭娴�
+ OutputStreamWriter writer = new OutputStreamWriter(this.socket.getOutputStream());
+ writer.write(JSON.toJSONString(data) + "\r\n");
+ writer.flush();
+// System.out.println("Sent message to server: " + JSON.toJSONString(httpCommand));
+ }catch (Exception e) {
+// e.printStackTrace();
+// System.out.println("socket write error");
+ this.socket.close();
+ this.socket = null;
+ }
}
private JSONObject filterBodyData(JSONObject data) {
--
Gitblit v1.9.1