diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/IosDeviceInitThread.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/IosDeviceInitThread.java index d9b7dc9..fc61c25 100644 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/IosDeviceInitThread.java +++ b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/deviceManager/thread/IosDeviceInitThread.java @@ -64,9 +64,15 @@ public abstract class IosDeviceInitThread extends Thread { } logger.debug("设置设备【{}】的nkAgent掉线之后的监听器................", phone.getUdid()); nkAgent.setOnDisconnectListener(() -> { - logger.warn("设备【{}】的nkAgent失效了,需要重新创建...........", phone.getUdid()); - IOSDeviceManager.getInstance().getIosInitThread(phone.getUdid()).createNKAgent(); - logger.warn("设备【{}】的nkAgent重新创建完成...........", phone.getUdid()); + synchronized (nkAgent) { + if (!nkAgent.getStatus()) { + logger.warn("设备【{}】的nkAgent失效了,需要重新创建...........", phone.getUdid()); + IOSDeviceManager.getInstance().getIosInitThread(phone.getUdid()).createNKAgent(); + logger.warn("设备【{}】的nkAgent重新创建完成...........", phone.getUdid()); + } else { + logger.warn("设备【{}】的nkAgent失效了,但是已经创建好了,不再创建了...........", phone.getUdid()); + } + } }); logger.debug("设备【{}】的nkAgent连接完毕................", phone.getUdid()); } diff --git a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosMessageHandlerThread.java b/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosMessageHandlerThread.java deleted file mode 100644 index c577a49..0000000 --- a/cctp-atu/atu-upper-computer/src/main/java/net/northking/cctp/upperComputer/webSocket/thread/IosMessageHandlerThread.java +++ /dev/null @@ -1,1014 +0,0 @@ -package net.northking.cctp.upperComputer.webSocket.thread; - -import cn.hutool.core.lang.UUID; -import com.alibaba.fastjson.JSONObject; -import net.northking.cctp.upperComputer.constants.IosInputKeyBoardEnum; -import net.northking.cctp.upperComputer.constants.KeyBoardCodeEnum; -import net.northking.cctp.upperComputer.constants.ResponseCmd; -import net.northking.cctp.upperComputer.deviceManager.AndroidDeviceManager; -import net.northking.cctp.upperComputer.deviceManager.IOSDeviceManager; -import net.northking.cctp.upperComputer.deviceManager.UpperComputerManager; -import net.northking.cctp.upperComputer.deviceManager.thread.IosDeviceInitThread; -import net.northking.cctp.upperComputer.driver.adb.AdbDevice; -import net.northking.cctp.upperComputer.driver.adb.AdbTransport; -import net.northking.cctp.upperComputer.driver.agent.AndroidAgentSession; -import net.northking.cctp.upperComputer.driver.agent.command.*; -import net.northking.cctp.upperComputer.driver.ios.NKAgent; -import net.northking.cctp.upperComputer.entity.Attachment; -import net.northking.cctp.upperComputer.entity.PhoneEntity; -import net.northking.cctp.upperComputer.enums.FileBusinessTypeEnum; -import net.northking.cctp.upperComputer.exception.ExecuteException; -import net.northking.cctp.upperComputer.exception.ParamMistakeException; -import net.northking.cctp.upperComputer.thread.IosTiDeviceThread; -import net.northking.cctp.upperComputer.utils.HttpUtils; -import net.northking.cctp.upperComputer.utils.ProcessCmdUtils; -import net.northking.cctp.upperComputer.utils.SessionUtils; -import net.northking.cctp.upperComputer.utils.SpringUtils; -import net.northking.cctp.upperComputer.webSocket.entity.*; -import net.northking.cctp.upperComputer.webSocket.function.IosFunction; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.time.StopWatch; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.websocket.Session; -import java.io.*; -import java.nio.file.Files; -import java.util.*; -import java.util.concurrent.*; - -public class IosMessageHandlerThread extends AbstractMessageHandler { - - private final Logger logger = LoggerFactory.getLogger(IosMessageHandlerThread.class); - - private PhoneEntity phoneEntity; - - private IosFunction function; - - private CatchParam catchParam = new CatchParam(); - - private IosScreenResponseThread screenResponseThread; - - private GetNodeTreeThread nodeTreeThread; - - private StopWatch handleWatch = new StopWatch(); - - private Float startX; - - private Float startY; - - private Float endX; - - private Float endY; - - private AdbDevice adbDevice; - - private boolean shiftDown = false; - - private boolean ctrlDown = false; - - private boolean altDown = false; - - private boolean capsDown = false; - - private String tenantId; - - private String logPath; //记录日志的临时位置 - - private IosPerfThread iosPerfThread; - - private IosLogThread iosLogThread; - - private List capsUpLetters = Arrays.asList("A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"); - - private List capsDownLetters = Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"); - - - public IosMessageHandlerThread(PhoneEntity phoneEntity, Session session) throws ParamMistakeException { - this.phoneEntity = phoneEntity; - this.session = session; - this.serial = phoneEntity.getUdid(); - this.function = new IosFunction(phoneEntity.getPort8100()); - setName("[" + phoneEntity.getUdid() + "-handleMsg]"); - initDeviceRequireParam(); - } - @Override - public void startUiNode(CmdRequest request) { - if (null == nodeTreeThread || nodeTreeThread.isInterrupted() || !nodeTreeThread.isAlive()) { - try { - IosDeviceInitThread iosInitThread = IOSDeviceManager.getInstance().getIosInitThread(phoneEntity.getUdid()); - if (null == iosInitThread || iosInitThread.isInterrupted() || !iosInitThread.isAlive()) { - SessionUtils.sendFailureMessage(session, request, "设备还未准备就绪,请稍后再试"); - return; - } - NKAgent nkAgent = iosInitThread.getNkAgent(); - if (null == nkAgent) { - SessionUtils.sendFailureMessage(session, request, "设备还未准备就绪,请稍后再试"); - return; - } - nodeTreeThread = new GetNodeTreeThread(session,phoneEntity.getUdid(),request); - } catch (Exception e) { - if (e instanceof ExecuteException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - } else { - SessionUtils.sendFailureMessage(session, request, "获取设备节点失败"); - } - return; - } - nodeTreeThread.start(); - } else { - nodeTreeThread.startGetNodeTree(request); - } - } - - @Override - public void stopUiNode(CmdRequest request) { - if (null != nodeTreeThread) { - nodeTreeThread.stopGetNodeTree(request); - return; - } - SessionUtils.sendSuccessData(session, request, null,"该设备尚未开启获取节点树"); - } - @Override - public void clearAndCloseDeviceAgentConnection() { - - } - - @Override - public void reConnectDeviceAgent() { - - } - - @Override - public void closeADBDebug(CmdRequest request) { - } - - - @Override - public void openADBDebug(CmdRequest request) { - } - - - @Override - public void pullFileFromDevice(CmdRequest request) { - } - - - @Override - public void pushFileToDevice(CmdRequest request) { - } - - - @Override - public void getFileList(CmdRequest request) { - } - - - @Override - public void downloadLogcat(CmdRequest request) { - } - - - @Override - public void stopLogcat(CmdRequest request) { - Map data = request.getData(); - if (iosLogThread != null && iosLogThread.isAlive()) { - ParamCheck tenantIdCheck = ParamCheck.build().name("tenantId").type("string").length(32); - Map params = null; - try { - params = checkParam(data, false, tenantIdCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - //若无值则记录临时日志文件地址 - tenantId = (String) params.get("tenantId"); - logPath = StringUtils.isBlank(logPath) ? iosLogThread.getLogFilePath() : logPath; - String logFilePath = iosLogThread.stopLog(tenantId); - if (logFilePath != null) { - Map result = new HashMap<>(); - result.put("filePath", logFilePath); - SessionUtils.sendSuccessData(session, request, result, "结束日志成功"); - } else { - SessionUtils.sendFailureMessage(session, request, "上传日志失败"); - } - } else { - SessionUtils.sendFailureMessage(session, request, "未找到开启日志信息"); - } - } - - @Override - public void startLogcat(CmdRequest request) { - if (null != iosLogThread && iosLogThread.isAlive()) { - //拿上一次日志的临时文件位置 - logPath = StringUtils.isBlank(logPath) ? iosLogThread.getLogFilePath() : logPath; - iosLogThread.killLog(); - } - iosLogThread = new IosLogThread(serial,session,request,logPath); - iosLogThread.start(); - SessionUtils.sendContinuousData(session, request, null, "开启日志成功"); - } - - @Override - public void startPerf(CmdRequest request) { - Map data = request.getData(); - ParamCheck packageNameCheck = ParamCheck.build().name("packageName").type("string").length(Integer.MAX_VALUE); - Map params = null; - try { - params = checkParam(data, false, packageNameCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - String packageName = (String) data.get("packageName"); - if (null != iosPerfThread && iosPerfThread.isAlive()) { - iosPerfThread.stopThread(); - logger.debug("成功关闭原有性能线程"); - } - iosPerfThread = new IosPerfThread(session,request); - iosPerfThread.initData(serial,packageName); - iosPerfThread.start(); - SessionUtils.sendContinuousData(session, request, null, "开启性能数据成功"); - } - - @Override - public void stopPerf(CmdRequest request) { - if (iosPerfThread != null && iosPerfThread.isAlive()) { - logger.debug("关闭"+serial+"设备ios性能线程"); - try { - iosPerfThread.stopThread(); - iosPerfThread.interrupt(); - iosPerfThread = null; - SessionUtils.sendSuccessData(session, request, null, "停止性能数据成功"); - }catch (Exception e) { - logger.error("关闭性能线程异常",e); - SessionUtils.sendFailureMessage(session, request, "停止性能数据异常"); - } - }else { - logger.warn("性能线程未开启,设备id:{}",serial); - } - } - - @Override - public void sendShellToDevice(CmdRequest request) { - - } - - @Override - public void uninstallApp(CmdRequest request) { - Map data = request.getData(); - ParamCheck packageNameCheck = ParamCheck.build().name("packageName").type("string").length(Integer.MAX_VALUE); - Map params = null; - try { - params = checkParam(data, false, packageNameCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - String packageName = (String) params.get("packageName"); - String[] cmds = {"tidevice", "-u", phoneEntity.getUdid(), "uninstall", packageName}; - ProcessBuilder builder = new ProcessBuilder(Arrays.asList(cmds)).redirectErrorStream(true); - try { - Process process = builder.start(); - String line = null; - BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), "gbk")); - StringBuilder stringBuilder = new StringBuilder(); - while (null != (line = in.readLine())) { - logger.debug("卸载applist结果:{}", line); - stringBuilder.append(line); - } - String result = stringBuilder.toString(); - if (result.endsWith("Complete")) { - SessionUtils.sendSuccessData(session, request, null, "应用卸载成功"); - } - } catch (IOException e) { - logger.error("卸载应用[{}]失败", packageName, e); - SessionUtils.sendFailureMessage(session, request, "卸载应用失败"); - } - } - - @Override - public void getAppList(CmdRequest request) { - Map result = new HashMap<>(); - String[] cmds = {"tidevice", "-u", phoneEntity.getUdid(), "applist"}; - ProcessBuilder builder = new ProcessBuilder(Arrays.asList(cmds)).redirectErrorStream(true); - try { - Process process = builder.start(); - String line = null; - BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8")); - List> appList = new ArrayList<>(); - while (null != (line = in.readLine())) { - logger.debug("安装applist结果:{}", line); - if (StringUtils.isNotBlank(line)) { - String[] split = line.split(" "); - Map appMap = new HashMap<>(); - appMap.put("value", split[0]); - appMap.put("label", split[1]); - appList.add(appMap); - } - } - result.put("result", appList); - } catch (IOException e) { - logger.error("获取appList失败", e); - SessionUtils.sendFailureMessage(session, request, "应用列表获取失败"); - return; - } - SessionUtils.sendSuccessData(session, request, result, "应用列表获取成功"); - } - - @Override - public void inputKeyUp(CmdRequest request) { - Map data = request.getData(); - ParamCheck keyCodeCheck = ParamCheck.build().name("key").type("string"); - Map params = null; - try { - params = checkParam(data, false, keyCodeCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - String key = (String) params.get("key"); - logger.debug("抬起键key:{}", key); - if (IosInputKeyBoardEnum.containsKey(key)) { - if (key.equalsIgnoreCase(IosInputKeyBoardEnum.BACKSPACE.getKeyCode())) { - function.deleteOneKey(); - } else { - function.inputText(key); - } - } - SessionUtils.sendSuccessData(session, request, null, "抬起键[" + key + "]处理成功"); - } - - @Override - public void inputKeyDown(CmdRequest request) { - Map data = request.getData(); - ParamCheck keyCodeCheck = ParamCheck.build().name("key").type("string"); - Map params = null; - try { - params = checkParam(data, false, keyCodeCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - String key = (String) params.get("key"); - logger.debug("摁下键key:{}", key); - setKeyCodeStatus(key, true); - int code = KeyBoardCodeEnum.getCode(key, !shiftDown); - logger.debug("转换后的code:{}", code); - if (code < 0) { - SessionUtils.sendFailureMessage(session, request, "键[" + key + "]不存在"); - return; - } - SessionUtils.sendSuccessData(session, request, null, "摁下键[" + key + "]处理成功"); - } - - private int getMetaState() { - int meta = 0; - if (shiftDown) { - meta += 1; - } - if (altDown) { - meta += 2; - } - if (ctrlDown) { - meta += 4096; - } - if (capsDown) { - meta += 1048576; - } - return meta; - } - - /** - * 设置摁下的是否是shift,ctrl,alt - * - * @param key - * @param down 摁下为true,抬起为false - */ - private void setKeyCodeStatus(String key, boolean down) { - if (key.equals(KeyBoardCodeEnum.KEYCODE_SHIFT_LEFT.getWebValue())) { - shiftDown = down; - } else if (key.equals(KeyBoardCodeEnum.KEYCODE_ALT_LEFT.getWebValue())) { - altDown = down; - } else if (key.equals(KeyBoardCodeEnum.KEYCODE_CTRL_LEFT.getWebValue())) { - ctrlDown = down; - } else if (capsUpLetters.contains(key)) { //包含大写字母 - if (shiftDown) { //如果是按了shift - logger.debug("没摁大写锁定"); - capsDown = false; - } else { - logger.debug("摁了大写锁定"); - capsDown = true; - } - } else if (capsDownLetters.contains(key)) { //小写字母 - if (shiftDown) { //如果按了shift - logger.debug("没摁大写锁定"); - capsDown = true; - } else { - logger.debug("摁了大写锁定"); - capsDown = false; - } - } else if (key.equals(KeyBoardCodeEnum.KEYCODE_CAPS_LOCK.getWebValue())) { - logger.debug("摁大写锁定。。。。。。。。。。"); - capsDown = !capsDown; - } - } - - @Override - public void installApp(CmdRequest request) { - Map data = request.getData(); - ParamCheck textCheck = ParamCheck.build().name("appUrl").type("string").length(Integer.MAX_VALUE); - ParamCheck packageCheck = ParamCheck.build().name("packageName").type("string").length(Integer.MAX_VALUE); - Map params = null; - try { - params = checkParam(data, false, textCheck,packageCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - String appUrl = (String) params.get("appUrl"); - String packageName = (String) params.get("packageName"); - logger.debug("appUrl:{},packageName:{}",appUrl,packageName); - try { - downloadAppToLocalAndInstall(appUrl, request,packageName); - } catch (IOException e) { - logger.error("应用安装失败", e); - SessionUtils.sendFailureMessage(session, request, "应用安装失败"); - return; - } - - } - - private void downloadAppToLocalAndInstall(String appUrl, CmdRequest request, String packageName) throws IOException { - File fileDir = new File(UpperComputerManager.getInstance().getApplicationPath() + "/tempApp/"); - File appFile = new File(UpperComputerManager.getInstance().getApplicationPath() + "/tempApp/" + appUrl); - if (!fileDir.exists()) { //文件夹不存在 - fileDir.mkdirs(); - } - String serverIp = SpringUtils.getProperties("nk.mobile-computer.serverAddr"); - String appDownloadPath = SpringUtils.getProperties("nk.mobile-computer.publicDownloadFile"); - appDownloadPath = appDownloadPath.replace("{appUrl}", appUrl); - HttpUtils.downloadFileToLocal(serverIp + appDownloadPath, fileDir.getAbsolutePath(), appUrl); - Long totalSpace = appFile.length(); - logger.info("应用总大小:{}", totalSpace); - String[] cmds = new String[]{"tidevice", "-u", phoneEntity.getUdid(), "install", appFile.getAbsolutePath()}; - ProcessBuilder builder = new ProcessBuilder(Arrays.asList(cmds)).redirectErrorStream(true); - Process process = builder.start(); - String line = null; - BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream())); - Map result = new HashMap<>(); - boolean finished = false; - while (null != (line = in.readLine())) { - logger.debug("安装app【{}】结果:{}", appFile.getAbsolutePath(), line); - //增加新解析方式 非json返回 - if (!line.startsWith("{")) { - if (line.startsWith("-")) { - String valStr = line.substring(line.indexOf("(")+1,line.indexOf("%")); - if (StringUtils.isNotBlank(valStr)) { - result.put("percent", Integer.parseInt(valStr)); - SessionUtils.sendContinuousData(session, request, result, "应用安装进度"); - } - }else if (line.trim().equals("Complete")) { - result.put("percent", 100); - SessionUtils.sendContinuousData(session, request, result, "应用安装进度"); - finished = true; - } - continue; - } - JSONObject value = null; - try { - value = JSONObject.parseObject(line, JSONObject.class); - } catch (Exception e) { - SessionUtils.sendFailureMessage(session, request, "应用安装失败"); - return; - } - int action = value.getIntValue("action"); - int percent = 0; - int sendPercent = 0; - if (action == 1) { //传输 - percent = value.getIntValue("percent"); - if (percent % 2 == 0) { - sendPercent = percent / 2; - result.put("percent", sendPercent); - SessionUtils.sendContinuousData(session, request, result, "应用安装进度"); - } - } else if (action == 2) { - if (sendPercent != 50) { - sendPercent = 50; - result.put("percent", 50); - SessionUtils.sendContinuousData(session, request, result, "应用安装进度"); - } - } else if (action == 3) { //安装 - percent = value.getIntValue("percent"); - if (percent % 2 == 0) { - sendPercent += percent / 2; - result.put("percent", sendPercent); - SessionUtils.sendContinuousData(session, request, result, "应用安装进度"); - } - } else if (action == 4) { - if (sendPercent != 100) { - result.put("percent", 100); - SessionUtils.sendContinuousData(session, request, result, "应用安装进度"); - finished = true; - } - } - } - if (finished) { - SessionUtils.sendSuccessData(session, request, null, "应用安装完成"); - startApp(serial, packageName); - }else { - SessionUtils.sendFailureMessage(session, request, "应用安装失败"); - } - //删除临时文件 - if (null != appFile && appFile.exists()) { - appFile.delete(); - } - } - - private void startApp(String serial, String PackageName) { - Process proc = null; - try { - List cmdList1 = new ArrayList<>(); - cmdList1.add("tidevice"); - cmdList1.add("-u"); - cmdList1.add(serial); - cmdList1.add("launch"); - cmdList1.add(PackageName); - logger.debug("执行启动应用命令,包名:{}",PackageName); - proc = ProcessCmdUtils.execCmd(cmdList1); - if (proc.waitFor() != 0) { - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - @Override - public void openBrowser(CmdRequest request) { - } - - @Override - public void setWifiStatus(CmdRequest request) { - } - - @Override - public void openSetting(CmdRequest request) { - } - - @Override - public void deviceOpenCamera(CmdRequest request) { - } - - @Override - public void restartDevice(CmdRequest request) { - - } - - @Override - public void rotationScreen(CmdRequest request) { - Map data = request.getData(); - ParamCheck textCheck = ParamCheck.build().name("rotation").type("int").rangeSelection().withIntValue(Arrays.asList(0, 1, 2, 3)); - Map params = null; - try { - params = checkParam(data, false, textCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - int rotation = (int) params.get("rotation"); - Map param = new HashMap<>(); - param.put("x", 0); - param.put("y", 0); - switch (rotation) { - case 0: - param.put("z", 0); - break; - case 1: - param.put("z", 90); - break; - case 2: - param.put("z", 180); - break; - case 3: - param.put("z", 270); - break; - default: - SessionUtils.sendFailureMessage(session, request, "屏幕旋转方向参数传递错误"); - return; - } - JSONObject jsonObject = function.rotationScreen(param); - logger.debug("旋转屏幕结果:{}", JSONObject.toJSONString(jsonObject)); - } - - - @Override - public void clipboardCopy(CmdRequest request) { - } - - @Override - public void clipboardPast(CmdRequest request) { - } - - @Override - public void inputSetText(CmdRequest request) { - Map data = request.getData(); - ParamCheck textCheck = ParamCheck.build().name("text").type("string").length(Integer.MAX_VALUE); - ParamCheck clearCheck = ParamCheck.build().name("clear").type("boolean"); - Map params = null; - try { - params = checkParam(data, false, textCheck, clearCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - String text = (String) params.get("text"); - boolean clear = (boolean) params.get("clear"); - logger.debug("输入文本:{},是否清空:{}", text, clear); - function.inputText(text); - SessionUtils.sendSuccessData(session, request, null, "设置输入文本成功"); - } - - @Override - public void inputType(CmdRequest request) { - } - - @Override - public void inputKeyPress(CmdRequest request) { - Map data = request.getData(); - ParamCheck keyCodeCheck = ParamCheck.build().name("key").type("string"); - Map params = null; - try { - params = checkParam(data, false, keyCodeCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - String key = (String) params.get("key"); - logger.debug("输入热键key:{}", key); - switch (key) { - case "home": - function.pressHome(); - break; - default: - SessionUtils.sendFailureMessage(session, request, "热键[" + key + "]不存在"); - return; - } - SessionUtils.sendSuccessData(session, request, null, "热键处理成功"); - } - - @Override - public void touchUp(CmdRequest request) { - Map data = request.getData(); - ParamCheck xCheck = ParamCheck.build().name("x").type("double").withMin(0).withMax(catchParam.getWidth()); - ParamCheck yCheck = ParamCheck.build().name("y").type("double").withMin(0).withMax(catchParam.getHeight()); - Map params = null; - try { - params = checkParam(data, false, xCheck, yCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - Point point = calculatePoint(params); - if (handleWatch.isStarted()) { - handleWatch.stop(); - long time = handleWatch.getTime(); - logger.debug("操作时间:{}ms", time); - endX = point.getX(); - endY = point.getY(); - if (Math.abs(endX - startX) > 10 || Math.abs(endY - startY) > 10) { //滑动 - function.swipe(startX, startY, endX, endY, time); - } else { //点击 - if (time < 2000) {//点击 - function.click(startX, startY); - } else { //长按 - function.longPress(startX, startY, endX, endY); - } - } - handleWatch.reset(); - } - logger.debug("抬起实际位置x:{},y:{}", point.getX(), point.getY()); - SessionUtils.sendSuccessData(session, request, null, "抬起成功"); - } - - @Override - public void touchMove(CmdRequest request) { - Map data = request.getData(); - ParamCheck xCheck = ParamCheck.build().name("x").type("double").withMin(0).withMax(catchParam.getWidth()); - ParamCheck yCheck = ParamCheck.build().name("y").type("double").withMin(0).withMax(catchParam.getHeight()); - Map params = null; - try { - params = checkParam(data, false, xCheck, yCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - Point point = calculatePoint(params); - if (!handleWatch.isStarted()) { - handleWatch.reset(); - handleWatch.start(); - } - endX = point.getX(); - endY = point.getY(); - logger.debug("滑动实际位置x:{},y:{}", point.getX(), point.getY()); - SessionUtils.sendSuccessData(session, request, null, "滑动成功"); - } - - private void initDeviceRequireParam() throws ParamMistakeException { - logger.info("获取手机【{}】的实际宽高............................", phoneEntity.getUdid()); - catchParam.setScale(phoneEntity.getScale()); - logger.info("手机的实际宽:{}高:{}............................", phoneEntity.getScreenWidth() * phoneEntity.getScale(), phoneEntity.getScreenHeight() * phoneEntity.getScale()); - } - - @Override - public void touchDown(CmdRequest request) { - Map data = request.getData(); - ParamCheck xCheck = ParamCheck.build().name("x").type("double").withMin(0).withMax(catchParam.getWidth()); - ParamCheck yCheck = ParamCheck.build().name("y").type("double").withMin(0).withMax(catchParam.getHeight()); - Map params = null; - try { - params = checkParam(data, false, xCheck, yCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - Point point = calculatePoint(params); - logger.debug("开始计时。。。。。。。。"); - if (handleWatch.isStarted()) { - handleWatch.reset(); - } - handleWatch.start(); - startX = point.getX(); - startY = point.getY(); - logger.debug("摁下实际位置x:{},y:{}", point.getX(), point.getY()); - SessionUtils.sendSuccessData(session, request, null, "摁下成功"); - } - - private Point calculatePoint(Map data) { - Double x = Double.parseDouble(data.get("x") + ""); - Double y = Double.parseDouble(data.get("y") + ""); - Double realX = x.doubleValue() / catchParam.getWidth() * (phoneEntity.getScreenWidth() * phoneEntity.getScale()); - Double realY = y.doubleValue() / catchParam.getHeight() * (phoneEntity.getScreenHeight() * phoneEntity.getScale()); - realX = realX / catchParam.getScale(); - realY = realY / catchParam.getScale(); - return new Point(realX.floatValue(), realY.floatValue()); - } - - @Override - public void screenShot(CmdRequest request) { - Map data = request.getData(); - ParamCheck tenantIdCheck = ParamCheck.build().name("tenantId").type("string").length(32); - Map params = null; - try { - params = checkParam(data, false, tenantIdCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - File path = new File(UpperComputerManager.getInstance().getApplicationPath() + "/tempApp/"); - if (!path.exists()) { - path.mkdirs(); - } - String screenShotName = path.getAbsolutePath() + "/" + UUID.fastUUID().toString() + ".png"; - String[] screenShotCmd = new String[]{"tidevice", "-u", phoneEntity.getUdid(), "screenshot", screenShotName}; - ProcessBuilder builder = new ProcessBuilder(Arrays.asList(screenShotCmd)).redirectErrorStream(true); - Process process = null; - try { - process = builder.start(); - process.waitFor(); - } catch (IOException e) { - logger.error("截图失败", e); - SessionUtils.sendFailureMessage(session, request, "截图失败"); - } catch (InterruptedException e) { - logger.error("截图失败", e); - SessionUtils.sendFailureMessage(session, request, "截图失败"); - return; - } - File screenData = new File(screenShotName); - byte[] screenShotData = null; - try { - screenShotData = Files.readAllBytes(screenData.toPath()); - } catch (IOException e) { - logger.error("未读取到截图", e); - } finally { - if (screenData.exists()) { - screenData.delete(); - } - } - if (null != screenShotData && screenShotData.length > 0) { //截图 - logger.debug("收到手机【{}】截图,大小:{}k", phoneEntity.getUdid(), screenShotData.length / 1024); - String tenantId = (String) params.get("tenantId"); - //上传文件 - logger.debug("[{}]开始上传截图", phoneEntity.getUdid()); - String serverAddress = SpringUtils.getProperties("nk.mobile-computer.serverAddr"); - String pubUploadPath = SpringUtils.getProperties("nk.mobile-computer.publicUploadAddr"); - Attachment upload = null; - try { - logger.info("开始上传ios录制截图文件,设备:{}",adbDevice.getSerial()); - upload = HttpUtils.upload(serverAddress + pubUploadPath, screenShotData, tenantId, null, FileBusinessTypeEnum.MOBILE_RECORD_SCREENSHOT.getCode()); - } catch (Exception e) { - logger.debug("[{}]上传截图失败", phoneEntity.getUdid(), e); - } - if (null != upload && StringUtils.isNotBlank(upload.getId())) { - logger.debug("文件上传成功,返回id:{}", upload.getId()); - Map result = new HashMap<>(); - result.put("urlPath", upload.getUrlPath()); - result.put("id", upload.getId()); - SessionUtils.sendSuccessData(session, request, result, "截图成功"); - } else { - SessionUtils.sendFailureMessage(session, request, "上传截图失败"); - } - } else { - SessionUtils.sendFailureMessage(session, request, "未读到截图数据"); - } - - - } - - @Override - public void stopRecordScreen(CmdRequest request) { - String recordFileInfo = screenResponseThread.stopRecord(); - if (recordFileInfo != null) { - Map result = new HashMap<>(); - result.put("videoInfo", recordFileInfo); - SessionUtils.sendSuccessData(session, request, result, "结束录屏成功"); - } else { - SessionUtils.sendFailureMessage(session, request, "该设备未开启录屏"); - } - } - - @Override - public void startRecordScreen(CmdRequest request) { - Map data = request.getData(); - ParamCheck tenantIdCheck = ParamCheck.build().name("tenantId").type("string").length(32); - Map params = null; - try { - params = checkParam(data, false, tenantIdCheck); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - screenResponseThread.startRecordScreen((String) params.get("tenantId"),phoneEntity.getScreenWidth() * phoneEntity.getScale(), phoneEntity.getScreenHeight() * phoneEntity.getScale(),"1",null); - SessionUtils.sendSuccessData(session, request, null, "开启录屏成功"); - } - - @Override - public void changeScreenQuality(CmdRequest request) { - Map data = request.getData(); - ParamCheck quality = ParamCheck.build().name("quality").type("int").withMin(0).withMax(100); - ParamCheck frameRate = ParamCheck.build().name("framerate").type("int").withMin(0).withMax(100); - Map params = null; - try { - params = checkParam(data, false, quality, frameRate); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - int qualityUse = (int) params.get("quality"); - catchParam.setQuality(qualityUse); - int frameRateUse = (int) params.get("framerate"); - catchParam.setFrameRate(frameRateUse); - logger.debug("改变屏幕质量=====>width:{} height:{} quality:{} frameRate:{}", catchParam.getWidth(), catchParam.getHeight(), qualityUse, frameRateUse); - screenResponseThread.changeQuality(qualityUse / 100f); - } - - @Override - public void changeScreenSize(CmdRequest request) { - Map data = request.getData(); - ParamCheck width = ParamCheck.build().name("width").type("int").withMin(0).withMax(phoneEntity.getScreenWidth() * phoneEntity.getScale()); - ParamCheck height = ParamCheck.build().name("height").type("int").withMin(0).withMax(phoneEntity.getScreenHeight() * phoneEntity.getScale()); - Map params = null; - try { - params = checkParam(data, false, width, height); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - int widthUse = (int) params.get("width"); - catchParam.setWidth(widthUse); - int heightUse = (int) params.get("height"); - catchParam.setHeight(heightUse); - logger.debug("改变宽高屏幕=====>width:{} height:{} quality:{} frameRate:{}", widthUse, heightUse, catchParam.getQuality(), catchParam.getFrameRate()); - screenResponseThread.changeSize(widthUse, heightUse); - } - - @Override - public void handleScreenOn(CmdRequest request) { - Map data = request.getData(); - ParamCheck width = ParamCheck.build().name("width").type("int").withMin(0).withMax(phoneEntity.getScreenWidth() * phoneEntity.getScale()); - ParamCheck height = ParamCheck.build().name("height").type("int").withMin(0).withMax(phoneEntity.getScreenHeight() * phoneEntity.getScale()); - ParamCheck quality = ParamCheck.build().name("quality").type("int").withMin(0).withMax(100); - ParamCheck framerate = ParamCheck.build().name("framerate").type("int").withMin(0).withMax(100); - ParamCheck rotation = ParamCheck.build().name("rotation").type("int").rangeSelection().withIntValue(Arrays.asList(0, 1, 2, 3)); - Map params = null; - try { - params = checkParam(data, false, width, height, quality, framerate, rotation); - } catch (Exception e) { - logger.error("参数校验失败!", e); - if (e instanceof ParamMistakeException) { - SessionUtils.sendFailureMessage(session, request, e.getMessage()); - return; - } - } - int widthUse = (int) params.get("width"); - catchParam.setWidth(widthUse); - int heightUse = (int) params.get("height"); - catchParam.setHeight(heightUse); - int qualityUse = (int) params.get("quality"); - catchParam.setQuality(qualityUse); - int frameRateUse = (int) params.get("framerate"); - catchParam.setFrameRate(frameRateUse); - int rotationUse = (int) params.get("rotation"); - catchParam.setRotation(rotationUse); - logger.debug("开启屏幕=====>width:{} height:{} quality:{} frameRate:{},rotation:{}", widthUse, heightUse, qualityUse, frameRateUse, rotationUse); - screenResponseThread = IOSDeviceManager.getInstance().getScreenThread(phoneEntity.getUdid()); - if (null == screenResponseThread || screenResponseThread.isInterrupted() || !screenResponseThread.isAlive()) { - //读取手机端响应线程 - screenResponseThread = new IosScreenResponseThread(phoneEntity,null); - screenResponseThread.start(); - screenResponseThread.startSendScreenToWeb(session,catchParam); - screenResponseThread.setScreenOnRequest(request); - IOSDeviceManager.getInstance().saveDeviceScreenThread(phoneEntity.getUdid(), screenResponseThread); - } else { - screenResponseThread.startSendScreenToWeb(session,catchParam); - screenResponseThread.setScreenOnRequest(request); - } - } - - @Override - public void stopAndExit() { - if (null != screenResponseThread) { - screenResponseThread.stopFetchPic(); - } - if (null != iosPerfThread) { - iosPerfThread.stopThread(); - } - if (null != iosLogThread) { - if (tenantId == null) { - iosLogThread.killLog(); - } else { - iosLogThread.stopLog(tenantId); - } - } - if (null != nodeTreeThread) { - nodeTreeThread.exitGetNodeTree(); - } - if (StringUtils.isNotBlank(logPath)) { - File logFile = new File(logPath); - if (null != logFile && logFile.exists()) { - logFile.delete(); - logger.debug("ios临时日志文件已删除"); - } - } - cmdQueues.clear(); - interrupt(); - } - -}