|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private static final boolean DEBUG = false;//调试模式 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private List<JSONObject> socketReadResults = new ArrayList<>(); | 
|---|
|  |  |  | private List<JSONObject> socketResults = new ArrayList<>(); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //原始设备数据 | 
|---|
|  |  |  | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | listenSocketMessage(); | 
|---|
|  |  |  | listenInit();//监听初始化事件 | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | Thread otherThread = new Thread(() -> { | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | listenInit();//监听初始化事件 | 
|---|
|  |  |  | saveLog();//保存数据 | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | JSONObject result = JSON.parseObject(sb.toString());//得到响应结果集 | 
|---|
|  |  |  | if (!socketResults.isEmpty() && socketResults.size() >= 5) { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!socketResults.isEmpty() && socketResults.size() >= 20) { | 
|---|
|  |  |  | socketResults.remove(0);//清理头节点 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | socketResults.add(result);//添加数据 | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public JSONObject getRequestBody(String type) { | 
|---|
|  |  |  | public JSONObject getRequestBody(String type, String taskId) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | // 获取服务器响应 | 
|---|
|  |  |  | JSONObject result = null; | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (!responseType.equals(type)) { | 
|---|
|  |  |  | continue;//响应ID与请求ID不一致,不在调试模式下 | 
|---|
|  |  |  | continue;//响应类型与请求类型不一致,不在调试模式下 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (taskId != null) { | 
|---|
|  |  |  | String responseTaskId = resultBody.get("taskId").toString(); | 
|---|
|  |  |  | if (!responseTaskId.equals(taskId)) { | 
|---|
|  |  |  | continue;//响应ID与请求ID不一致,不在调试模式下 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | result = socketResult; | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //----------读取四向穿梭车状态----------- | 
|---|
|  |  |  | 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 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 { | 
|---|
|  |  |  | 
|---|
|  |  |  | 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; | 
|---|
|  |  |  | 
|---|
|  |  |  | 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); | 
|---|
|  |  |  | 
|---|
|  |  |  | 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(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | for (NyShuttleHttpCommand requestCommand : commandList) { | 
|---|
|  |  |  | while (true) { | 
|---|
|  |  |  | int i = 0; | 
|---|
|  |  |  | i++; | 
|---|
|  |  |  | JSONObject result = requestCommand(requestCommand); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | //                        return response;//请求失败 | 
|---|
|  |  |  | News.info("Socket命令下发失败,任务数据={},次数={}", JSON.toJSON(command), i); | 
|---|
|  |  |  | continue;//请求失败尝试重新请求 | 
|---|
|  |  |  | } | 
|---|
|  |  |  | this.shuttleProtocol.setSendTime(System.currentTimeMillis());//指令下发时间 | 
|---|
|  |  |  | response.setMessage(JSON.toJSONString(result)); | 
|---|
|  |  |  | response.setResult(true); | 
|---|
|  |  |  | News.info("Socket命令下发成功,任务数据={},次数={}", JSON.toJSON(command), i); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @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; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Override | 
|---|
|  |  |  | public List<NavigateNode> getMoveAdvancePath() { | 
|---|
|  |  |  | ObjectMapper objectMapper = SpringUtils.getBean(ObjectMapper.class); | 
|---|
|  |  |  | NavigateMapData navigateMapData = SpringUtils.getBean(NavigateMapData.class); | 
|---|
|  |  |  | 
|---|
|  |  |  | data.put("xp", xp); | 
|---|
|  |  |  | data.put("yp", yp); | 
|---|
|  |  |  | data.put("z", z); | 
|---|
|  |  |  | data.put("x", mapNode.getXBase()); | 
|---|
|  |  |  | data.put("y", mapNode.getYBase()); | 
|---|
|  |  |  | data.put("x", mapNode.getYBase()); | 
|---|
|  |  |  | data.put("y", mapNode.getXBase()); | 
|---|
|  |  |  | path.add(data); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | location.put("xp", row); | 
|---|
|  |  |  | location.put("yp", bay); | 
|---|
|  |  |  | location.put("z", lev); | 
|---|
|  |  |  | location.put("x", mapNode.getXBase()); | 
|---|
|  |  |  | location.put("y", mapNode.getYBase()); | 
|---|
|  |  |  | location.put("x", mapNode.getYBase()); | 
|---|
|  |  |  | location.put("y", mapNode.getXBase()); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | HashMap<String, Object> body = new HashMap<>(); | 
|---|
|  |  |  | body.put("responseType", "init");//复位 | 
|---|
|  |  |  | 
|---|
|  |  |  | //            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) { | 
|---|
|  |  |  | return null; | 
|---|
|  |  |  | //            return null; | 
|---|
|  |  |  | //taskId可能取空,不报错,正常情况 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | // 获取服务器响应 | 
|---|
|  |  |  | // 尝试100次 | 
|---|
|  |  |  | // 尝试10次 | 
|---|
|  |  |  | JSONObject result = null; | 
|---|
|  |  |  | for (int i = 0; i < 100; i++) { | 
|---|
|  |  |  | result = getRequestBody(requestType); | 
|---|
|  |  |  | for (int i = 0; i < 10; i++) { | 
|---|
|  |  |  | result = getRequestBody(requestType, taskId); | 
|---|
|  |  |  | if (result == null) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | Thread.sleep(100); | 
|---|
|  |  |  | 
|---|
|  |  |  | return result;//返回Body结果集 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private void requestCommandAsync(NyShuttleHttpCommand httpCommand) throws IOException { | 
|---|
|  |  |  | if (this.socket == null) { | 
|---|
|  |  |  | return; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //压缩数据包 | 
|---|
|  |  |  | 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)); | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private JSONObject filterBodyData(JSONObject data) { | 
|---|
|  |  |  | Object response = data.get("response"); | 
|---|
|  |  |  | if (response == null) { | 
|---|