#
Junjie
2 天以前 3c45d4f9f3aba5bc85a9577e43c0dffc71b93a22
src/main/java/com/zy/core/thread/impl/NyShuttleThread.java
@@ -56,7 +56,7 @@
    private static final boolean DEBUG = false;//调试模式
    private List<JSONObject> socketReadResults = new ArrayList<>();
    private List<JSONObject> socketResults = new ArrayList<>();
    private List<DeviceMsgModel> socketResults = new ArrayList<>();
    //原始设备数据
    private Object originDeviceData;
@@ -188,54 +188,32 @@
                data.put("originDeviceData", deviceMsg.getDeviceOriginMsg());
                socketReadResults.add(data);
            } else {
                socketResults.add(data);//添加数据
                socketResults.add(deviceMsg);//添加数据
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public JSONObject getRequestBody(String type, String taskId) {
    public JSONObject getRequestBody(String resultKey) {
        try {
            // 获取服务器响应
            JSONObject result = null;
            if (type.equals("readState")) {
                type = "state";
            }
            int idx = -1;
            for (int i = 0; i < socketResults.size(); i++) {
                JSONObject socketResult = socketResults.get(i);
                if (!socketResult.get("msgType").equals("responseMsg")) {//不是响应内容
                    continue;
                }
                JSONObject resultResponse = JSON.parseObject(socketResult.get("response").toString());
                JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
                String responseType = resultBody.get("responseType").toString();
                if (DEBUG) {
                    result = socketResult;
                DeviceMsgModel deviceMsgModel = socketResults.get(i);
                if(deviceMsgModel.getResultKey().equals(resultKey)){
                    idx = i;
                    result = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg()));
                    break;
                }
                if (!responseType.equals(type)) {
                    continue;//响应类型与请求类型不一致,不在调试模式下
                }
                if (taskId != null) {
                    String responseTaskId = resultBody.get("taskId").toString();
                    if (!responseTaskId.equals(taskId)) {
                        continue;//响应ID与请求ID不一致,不在调试模式下
                    }
                }
                result = socketResult;
                break;
            }
            if (result == null) {
                return null;//无响应结果
            }
            socketResults.remove(idx);
            return filterBodyData(result);//返回Body结果集
        } catch (Exception e) {
            return null;
@@ -359,35 +337,38 @@
            // 获取服务器响应
            JSONObject result = null;
            int removeIdx = -1;
            JSONObject socketResult = null;
            for (int i = 0; i < socketResults.size(); i++) {
                JSONObject socketResult = socketResults.get(i);
                if (socketResult == null) {
                DeviceMsgModel deviceMsgModel = socketResults.get(i);
                if (!deviceMsgModel.getDeviceMsgType().equals("shuttleInit")) {
                    continue;
                }
                if (!socketResult.get("msgType").equals("requestMsg")) {//不是请求内容
                    continue;
                }
                removeIdx = i;
                socketResult = JSON.parseObject(JSON.toJSONString(deviceMsgModel.getDeviceMsg()));
                break;
            }
                JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString());
                JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString());
                JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
                String requestType = resultBody.getString("requestType");
                Integer requestId = resultHeader.getInteger("requestId");
                if (requestType.equals("init")) {
                    removeIdx = i;//此数据已经处理,从结果集中剔除
                    socketResults.remove(removeIdx);
            if (socketResult == null) {
                return;
            }
                    Integer code = resultBody.getInteger("code");
                    //小车复位请求
                    ShuttleCommand initCommand = getInitCommand(requestId, code);
                    //发出请求
                    NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class);
                    requestCommand(httpCommand);
            JSONObject resultResponse = JSON.parseObject(socketResult.get("request").toString());
            JSONObject resultHeader = JSON.parseObject(resultResponse.get("header").toString());
            JSONObject resultBody = JSON.parseObject(resultResponse.get("body").toString());
            String requestType = resultBody.getString("requestType");
            Integer requestId = resultHeader.getInteger("requestId");
            if (requestType.equals("init")) {
                socketResults.remove(removeIdx);
                    log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
                    OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
                    break;
                }
                Integer code = resultBody.getInteger("code");
                //小车复位请求
                ShuttleCommand initCommand = getInitCommand(requestId, code);
                //发出请求
                NyShuttleHttpCommand httpCommand = JSON.parseObject(initCommand.getBody(), NyShuttleHttpCommand.class);
                requestCommand(httpCommand);
                log.info(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
                OutputQueue.SHUTTLE.offer(MessageFormat.format("【{0}】四向车复位上报 ===>> [code:{1}] [ip:{2}] [port:{3}]", deviceConfig.getDeviceNo(), code, deviceConfig.getIp(), deviceConfig.getPort()));
            }
        } catch (Exception e) {
            e.printStackTrace();
@@ -479,9 +460,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -502,9 +483,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -524,9 +505,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -554,9 +535,9 @@
        try {
            //发出请求
            NyShuttleHttpCommand httpCommand = JSON.parseObject(command.getBody(), NyShuttleHttpCommand.class);
            JSONObject requestToken = requestCommand(httpCommand);
            String resultKey = requestCommand(httpCommand);
            //查询请求结果
            JSONObject result = queryCommandStatus(requestToken.getString("requestType"), requestToken.getString("taskId"));
            JSONObject result = queryCommandStatus(resultKey);
            if (result == null) {
                return response;//请求失败
            }
@@ -1127,7 +1108,7 @@
    }
    //发出请求
    private JSONObject requestCommand(NyShuttleHttpCommand httpCommand) throws IOException {
    private String requestCommand(NyShuttleHttpCommand httpCommand) throws IOException {
        try {
            DeviceMsgUtils deviceMsgUtils = SpringUtils.getBean(DeviceMsgUtils.class);
            if (deviceMsgUtils == null) {
@@ -1143,33 +1124,19 @@
            commandMsgModel.setDeviceType(String.valueOf(SlaveType.Shuttle));
            commandMsgModel.setCommand(data);
            String key = deviceMsgUtils.sendDeviceCommand(SlaveType.Shuttle, deviceConfig.getDeviceNo(), commandMsgModel);
            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可能取空,不报错,正常情况
            }
            JSONObject result = new JSONObject();
            result.put("requestType", requestType);
            result.put("taskId", taskId);
            return result;
            return key;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    private JSONObject queryCommandStatus(String requestType, String taskId) {
    private JSONObject queryCommandStatus(String resultKey) {
        // 获取服务器响应
        // 尝试50次
        JSONObject result = null;
        for (int i = 0; i < 50; i++) {
            result = getRequestBody(requestType, taskId);
            result = getRequestBody(resultKey);
            if (result == null) {
                try {
                    Thread.sleep(500);