From 285a51e8bc0f9128ea238d3edfe6c654a30e1acb Mon Sep 17 00:00:00 2001 From: Junjie <fallin.jie@qq.com> Date: 星期五, 04 七月 2025 15:04:17 +0800 Subject: [PATCH] # --- src/main/java/com/zy/core/thread/impl/NyShuttleThread.java | 290 ++++++++++++++++++++++++++++++++++++--------------------- 1 files changed, 183 insertions(+), 107 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 31abb43..12d4ac3 100644 --- a/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java +++ b/src/main/java/com/zy/core/thread/impl/NyShuttleThread.java @@ -22,10 +22,12 @@ import com.zy.common.utils.NavigatePositionConvert; import com.zy.common.utils.RedisUtil; import com.zy.core.News; +import com.zy.core.Utils.DeviceMsgUtils; import com.zy.core.action.ShuttleAction; import com.zy.core.cache.OutputQueue; import com.zy.core.enums.*; import com.zy.core.model.CommandResponse; +import com.zy.core.model.DeviceMsgModel; import com.zy.core.model.ShuttleSlave; import com.zy.core.model.command.NyShuttleHttpCommand; import com.zy.core.model.command.ShuttleCommand; @@ -38,11 +40,7 @@ import lombok.Data; import lombok.extern.slf4j.Slf4j; -import java.io.BufferedReader; import java.io.IOException; -import java.io.InputStreamReader; -import java.io.OutputStreamWriter; -import java.net.Socket; import java.text.MessageFormat; import java.util.*; @@ -53,10 +51,10 @@ private ShuttleSlave slave; private RedisUtil redisUtil; private ShuttleProtocol shuttleProtocol; - private Socket socket; private static final boolean DEBUG = false;//璋冭瘯妯″紡 + private List<JSONObject> socketReadResults = new ArrayList<>(); private List<JSONObject> socketResults = new ArrayList<>(); //鍘熷璁惧鏁版嵁 @@ -70,26 +68,15 @@ @Override public void run() { News.info("{}鍙峰洓鍚戣溅绾跨▼鍚姩", slave.getId()); - this.connect(); - - //鐩戝惉娑堟伅骞跺瓨鍌� - Thread innerThread = new Thread(() -> { - while (true) { - try { - listenSocketMessage(); - } catch (Exception e) { - e.printStackTrace(); - } - } - }); - innerThread.start(); //璁惧璇诲彇 Thread readThread = new Thread(() -> { while (true) { try { + listenMessageFromRedis(); + listenInit();//鐩戝惉鍒濆鍖栦簨浠� read(); - Thread.sleep(50); + Thread.sleep(100); } catch (Exception e) { log.error("ShuttleThread Fail", e); } @@ -101,7 +88,13 @@ Thread executeThread = new Thread(() -> { while (true) { try { - ShuttleAction shuttleAction = SpringUtils.getBean(ShuttleAction.class); + ShuttleAction shuttleAction = null; + try { + shuttleAction = SpringUtils.getBean(ShuttleAction.class); + }catch (Exception e){ + continue; + } + if (shuttleAction == null) { continue; } @@ -135,7 +128,6 @@ Thread otherThread = new Thread(() -> { while (true) { try { - listenInit();//鐩戝惉鍒濆鍖栦簨浠� saveLog();//淇濆瓨鏁版嵁 } catch (Exception e) { e.printStackTrace(); @@ -173,28 +165,30 @@ } } - private void listenSocketMessage() { + private void listenMessageFromRedis() { try { - if (this.socket == null) { + DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); + if (deviceMsgUtils == null) { return; } + DeviceMsgModel deviceMsg = deviceMsgUtils.getDeviceMsg(SlaveType.Shuttle, slave.getId()); + if(deviceMsg == null){ + return; + } + JSONObject result = JSON.parseObject(deviceMsg.getDeviceMsg().toString());//寰楀埌鍝嶅簲缁撴灉闆� - // 鑾峰彇杈撳叆娴� - BufferedReader reader = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); - // 璇诲彇鏈嶅姟鍣ㄧ殑鍝嶅簲 - StringBuffer sb = new StringBuffer(); - char[] chars = new char[2048];//缂撳啿鍖� - while (true) { - reader.read(chars); - String trim = new String(chars); - sb.append(trim); - if (trim.lastIndexOf("\r\n") != -1) { - break; + String msgType = result.getString("msgType"); + if ("responseMsg".equals(msgType)) { + JSONObject response = result.getJSONObject("response"); + JSONObject body = response.getJSONObject("body"); + if (body.containsKey("workingMode")) { + //read + socketReadResults.add(body); + return; } } - JSONObject result = JSON.parseObject(sb.toString());//寰楀埌鍝嶅簲缁撴灉闆� - if (!socketResults.isEmpty() && socketResults.size() >= 5) { + if (!socketResults.isEmpty() && socketResults.size() >= 20) { socketResults.remove(0);//娓呯悊澶磋妭鐐� } socketResults.add(result);//娣诲姞鏁版嵁 @@ -203,7 +197,7 @@ } } - public JSONObject getRequestBody(String type) { + public JSONObject getRequestBody(String type, String taskId) { try { // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� JSONObject result = null; @@ -226,7 +220,14 @@ } if (!responseType.equals(type)) { - continue;//鍝嶅簲ID涓庤姹侷D涓嶄竴鑷达紝涓嶅湪璋冭瘯妯″紡涓� + continue;//鍝嶅簲绫诲瀷涓庤姹傜被鍨嬩笉涓�鑷达紝涓嶅湪璋冭瘯妯″紡涓� + } + + if (taskId != null) { + String responseTaskId = resultBody.get("taskId").toString(); + if (!responseTaskId.equals(taskId)) { + continue;//鍝嶅簲ID涓庤姹侷D涓嶄竴鑷达紝涓嶅湪璋冭瘯妯″紡涓� + } } result = socketResult; @@ -245,10 +246,6 @@ private void read() { try { - if (this.socket == null || this.socket.isClosed()) { - //閾炬帴鏂紑閲嶆柊閾炬帴 - this.connect(); - } readStatus(); } catch (Exception e) { e.printStackTrace(); @@ -268,12 +265,37 @@ } //----------璇诲彇鍥涘悜绌挎杞︾姸鎬�----------- + DeviceMsgUtils deviceMsgUtils = null; + try { + deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); + }catch (Exception e){ + + } + if(deviceMsgUtils == null){ + return; + } + NyShuttleHttpCommand readStatusCommand = getReadStatusCommand(slave.getId()); - JSONObject data = requestCommand(readStatusCommand); + //鎸囦护瓒呰繃浜旀潯锛屼笉鍐嶄笅鍙戜换鍔$姸鎬佽姹� + TreeSet<String> deviceCommandMsgListKey = deviceMsgUtils.getDeviceCommandMsgListKey(SlaveType.Shuttle, slave.getId()); + if (deviceCommandMsgListKey.size() < 5) { + requestCommandAsync(readStatusCommand);//璇锋眰鐘舵�� + } + + if (this.socketReadResults.isEmpty()) { + if (System.currentTimeMillis() - shuttleProtocol.getLastOnlineTime() > 1000 * 60) { + //鏈�鍚庝竴娆′笂绾挎椂闂磋秴杩�60s锛岃瀹氱绾� + this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.OFFLINE); + } + return; + } + + JSONObject data = this.socketReadResults.get(0); + this.socketReadResults.remove(0); 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 { @@ -330,9 +352,13 @@ 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); + } + + if (shuttleProtocol.getProtocolStatusType().equals(ShuttleProtocolStatusType.OFFLINE) && shuttleProtocol.getDeviceStatus().intValue() == 1) { + this.shuttleProtocol.setProtocolStatus(ShuttleProtocolStatusType.IDLE); } this.originDeviceData = data; @@ -342,14 +368,6 @@ } catch (Exception e) { e.printStackTrace(); OutputQueue.SHUTTLE.offer(MessageFormat.format("銆恵0}銆戝洓鍚戠┛姊溅Socket鐘舵�佷俊鎭け璐� ===>> [id:{1}] [ip:{2}] [port:{3}]", DateUtils.convert(new Date()), slave.getId(), slave.getIp(), slave.getPort())); - try { - this.socket.close(); - this.socket = null; - Thread.sleep(1000); - this.connect(); - } catch (IOException | InterruptedException exception) { - e.printStackTrace(); - } } } @@ -376,6 +394,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); @@ -383,19 +404,13 @@ 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(); + e.printStackTrace(); } } @@ -689,6 +704,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; } @@ -704,6 +732,32 @@ if (Integer.valueOf(this.shuttleProtocol.getBatteryPower()) >= maxPower) { return true; } + return false; + } + + @Override + public boolean isFault() { + if (this.shuttleProtocol.getErrorCode() == null + || this.shuttleProtocol.getMode() == null + || this.shuttleProtocol.getExtend() == null + ) { + return false; + } + + if (this.shuttleProtocol.getMode() == 0) { + return true; + } + + if (!this.shuttleProtocol.getErrorCode().equals("0")) { + return true; + } + + InnerSuhttleExtend extend = (InnerSuhttleExtend) this.shuttleProtocol.getExtend(); + + if (extend.getSuspendState() == 1) { + return true; + } + return false; } @@ -995,17 +1049,6 @@ @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) { - 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; - } - return true; } @@ -1058,45 +1101,78 @@ return httpStandard; } - //鍙戝嚭璇锋眰 + //鍙戝嚭璇锋眰-鍚屾 private JSONObject requestCommand(NyShuttleHttpCommand httpCommand) throws IOException { - if (this.socket == null) { - return null; - } - - //鍘嬬缉鏁版嵁鍖� - 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)); - - String requestType = null; try { - requestType = httpCommand.getRequest().getBody().get("requestType").toString(); - } catch (Exception e) { - return null; - } - - // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� - // 灏濊瘯10娆� - JSONObject result = null; - for (int i = 0; i < 10; i++) { - result = getRequestBody(requestType); - if (result == null) { - try { - Thread.sleep(100); - } catch (Exception e) { - e.printStackTrace(); - } - }else { - break; + DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); + if (deviceMsgUtils == null) { + return null; } + + //鍘嬬缉鏁版嵁鍖� + JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand)); + data.remove("nodes"); + + String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, slave.getId(), data); + + 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鍙兘鍙栫┖锛屼笉鎶ラ敊锛屾甯告儏鍐� + } + + // 鑾峰彇鏈嶅姟鍣ㄥ搷搴� + // 灏濊瘯30娆� + JSONObject result = null; + for (int i = 0; i < 30; 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 result;//杩斿洖Body缁撴灉闆� + return null; + } + + //鍙戝嚭璇锋眰-绉绘 + private void requestCommandAsync(NyShuttleHttpCommand httpCommand) throws IOException { + try { + DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class); + if (deviceMsgUtils == null) { + return; + } + + //鍘嬬缉鏁版嵁鍖� + JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand)); + data.remove("nodes"); + + String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, slave.getId(), data); + + 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鍙兘鍙栫┖锛屼笉鎶ラ敊锛屾甯告儏鍐� + } + }catch (Exception e) { + e.printStackTrace(); + } } private JSONObject filterBodyData(JSONObject data) { -- Gitblit v1.9.1