|  |  | 
 |  |  | 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.*; | 
 |  |  | 
 |  |  |     private RedisUtil redisUtil; | 
 |  |  |     private ShuttleProtocol shuttleProtocol; | 
 |  |  |     private Socket socket; | 
 |  |  |     private long lastConnectTime = System.currentTimeMillis(); | 
 |  |  |  | 
 |  |  |     private static final boolean DEBUG = false;//调试模式 | 
 |  |  |  | 
 |  |  | 
 |  |  |                 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)); | 
 |  |  | 
 |  |  |                 JSONObject body = response.getJSONObject("body"); | 
 |  |  |                 if (body.containsKey("workingMode")) { | 
 |  |  |                     //read | 
 |  |  |                     socketReadResults.add(body); | 
 |  |  |                     JSONObject socketReadResult = new JSONObject(); | 
 |  |  |                     socketReadResult.put("body", body); | 
 |  |  |                     socketReadResult.put("originDeviceData", sb); | 
 |  |  |                     socketReadResults.add(socketReadResult); | 
 |  |  |                     return; | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  | 
 |  |  |             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); | 
 |  |  |             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 { | 
 |  |  | 
 |  |  |                     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())); | 
 |  |  |             } | 
 |  |  | 
 |  |  |                 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(); | 
 |  |  | 
 |  |  |             } | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //***************判断是否满充校准*************** | 
 |  |  |         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; | 
 |  |  |         } | 
 |  |  | 
 |  |  |             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 | 
 |  |  | 
 |  |  |     @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; | 
 |  |  |         } | 
 |  |  | 
 |  |  |  | 
 |  |  |     //发出请求 | 
 |  |  |     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可能取空,不报错,正常情况 | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         // 获取服务器响应 | 
 |  |  |         // 尝试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; | 
 |  |  |                 //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 result;//返回Body结果集 | 
 |  |  |         return null; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     private void requestCommandAsync(NyShuttleHttpCommand httpCommand) throws IOException { | 
 |  |  | 
 |  |  |             return; | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //压缩数据包 | 
 |  |  |         JSONObject data = JSON.parseObject(JSON.toJSONString(httpCommand)); | 
 |  |  |         data.remove("nodes"); | 
 |  |  |        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(); | 
 |  |  |            // 获取输出流 | 
 |  |  |            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) { |