YYPOST群发软件 发表于 2026-8-19 06:46:42

本地调试版原生websocket版

本地调试版原生websocket版






/**
* WebSocket 屏幕截图传输 - 本地调试版(AIWROK 原生 websocket 版)
*
* 👉 参考 AIWROK IDE 文档,5 个原生 API 正确签名:
*    void setSocketID(String arg0)
*    void event(Function arg0=连接成功, Function arg1=接收消息,
*               Function arg2=连接失败, Function arg3=断开连接)
*    void connet(String wsUrl)      ← 注意拼写:connet(双n少c,不是 connect)
*    void send(Object msg)
*    void close()
*
* 配合 WebSocket测试服务器 使用
*/


print.log("===== WebSocket 屏幕截图传输(AIWROK 原生版)开始 =====");

// ========== 配置 ==========
var config = {
    serverUrl: "192.168.10.103:8886",   // ← 改成 PC 的局域网 IP:端口
    screenshotInterval: 5000,            // 截图间隔(毫秒)
    reconnectInterval: 2500,             // 重连间隔(毫秒)
    maxReconnectAttempts: 10,            // 最大重连次数
    connectWaitSec: 15,                  // 单次连接等待秒数
    runDuration: 30000                   // 总运行时长(毫秒)
};

// ========== 连接状态 ==========
var ws = null;          // websocket 实例
var state = {
    connected: false,
    err: null,
    closed: false,
    saveDir: "",
    saveUrlPrefix: "",
    imgCount: 0,
    reconnectAttempts: 0,
    totalSent: 0
};
var screenshotTimer = null;

// ========== 服务器消息解析 ==========
function parseServerMessage(raw) {
    if (typeof raw !== "string") {
      try { raw = String(raw); } catch (e) { raw = "" + raw; }
    }
    var out = { type: "UNKNOWN", raw: raw };
    if (raw.indexOf("WELCOME|") === 0) {
      out.type = "WELCOME";
      var parts = raw.split("|");
      out.id = parts || "";
      for (var i = 2; i < parts.length; i++) {
            var eqIdx = parts.indexOf("=");
            if (eqIdx > 0) out.substring(0, eqIdx)] = parts.substring(eqIdx + 1);
      }
    } else if (raw.indexOf("IMG_SAVED|") === 0) {
      out.type = "IMG_SAVED";
      var p = raw.split("|");
      out.seq = p || "";
      out.sizeTxt = p || "";
      out.absPath = p || "";
      out.fileUrl = p || "";
    } else if (raw.indexOf("IMG_FAIL|") === 0) {
      out.type = "IMG_FAIL";
    } else if (raw.indexOf("ECHO|") === 0) {
      out.type = "ECHO";
      out.text = raw.substring("ECHO|".length);
    }
    return out;
}

// ========== 核心:用 AIWROK 原生 5 API 建立连接 ==========
function initWebSocket() {
    // 重置状态
    state.connected = false;
    state.err = null;
    state.closed = false;

    // ① 创建
    ws = new websocket();

    // ② setSocketID
    try { ws.setSocketID("screen_" + (new Date().getTime())); }
    catch (e) { printl("⚠️setSocketID 忽略异常: " + e.message); }

    // ③ event(4 个位置回调,顺序不能错!)
    //   arg0 = 连接成功   arg1 = 接收消息   arg2 = 连接失败   arg3 = 断开
    try {
      ws.event(
            function () {                              // arg0 连接成功
                state.connected = true;
                state.err = null;
                state.reconnectAttempts = 0;
                print.log("WS: onopen");
                printl("✅ 连接成功(onopen)");
                startScreenshotTimer();
            },
            function (msg) {                           // arg1 接收消息
                var raw;
                try { raw = String(msg); } catch (e) { raw = ""; }
                print.log("WS: onmessage len=" + raw.length);
                var parsed = parseServerMessage(raw);

                if (parsed.type === "WELCOME") {
                  state.saveDir = parsed.save_dir || "";
                  state.saveUrlPrefix = parsed.save_file_url || "";
                  printl("&#128233; WELCOME " + parsed.id);
                  if (state.saveDir) {
                        printl("&#128193; 保存目录: " + state.saveDir);
                        printl("&#128279; 目录URL: " + state.saveUrlPrefix);
                  }
                } else if (parsed.type === "IMG_SAVED") {
                  printl("&#128190; PC 已保存图片 " + parsed.seq);
                  printl("    大小: " + parsed.sizeTxt);
                  printl("    路径: " + parsed.absPath);
                  printl("    � " + parsed.fileUrl);
                } else if (parsed.type === "IMG_FAIL") {
                  printl("&#128308; 服务器保存失败: " + raw);
                } else if (parsed.type === "ECHO") {
                  printl("&#128233; 回显: " + parsed.text.substring(0, 150));
                } else {
                  printl("&#128233; 收到: " + raw.substring(0, 200) + (raw.length > 200 ? "..." : ""));
                }
            },
            function (err) {                           // arg2 连接失败
                var msg = "";
                try { msg = String(err); } catch (e) {}
                state.err = msg || "连接失败";
                state.connected = false;
                print.log("WS: onerror " + msg);
                printl("❌ 连接失败(onerror): " + msg);
                stopScreenshotTimer();
                reconnectWebSocket();
            },
            function () {                              // arg3 断开
                state.closed = true;
                state.connected = false;
                print.log("WS: onclose");
                printl("⚪ 连接断开(onclose)");
                stopScreenshotTimer();
                reconnectWebSocket();
            }
      );
    } catch (e) {
      printl("❌ event(4回调) 注册失败: " + e.message);
      reconnectWebSocket();
      return;
    }

    // ④ connet(双 n 少 c,千万别写成 connect)
    try {
      var url = "ws://" + config.serverUrl;
      printl("正在连接: " + url + "(" + config.connectWaitSec + " 秒超时)");
      print.log("调用 connet(" + url + ")");
      ws.connet(url);
    } catch (e) {
      printl("❌ connet 抛异常: " + e.message);
      state.err = e.message;
      reconnectWebSocket();
      return;
    }

    // 同步等待:如果在 connectWaitSec 秒内既没触发 onopen 也没 onerror,就当作失败
    var waited = 0;
    while (!state.connected && !state.err && waited < config.connectWaitSec * 1000) {
      sleep.millisecond(100);
      waited += 100;
    }
    if (!state.connected && !state.err) {
      state.err = "连接超时(" + config.connectWaitSec + " 秒内没有 onopen/onerror)";
      printl("❌ " + state.err);
      reconnectWebSocket();
    }
}

// ========== 断线重连 ==========
function reconnectWebSocket() {
    if (state.reconnectAttempts >= config.maxReconnectAttempts) {
      printl("&#128721; 已达到最大重连次数 " + config.maxReconnectAttempts + ",停止重连");
      return;
    }
    state.reconnectAttempts++;
    printl("⏱️重连 " + state.reconnectAttempts + "/" + config.maxReconnectAttempts + "," + (config.reconnectInterval / 1000) + " 秒后重试...");
    printl("重连 " + state.reconnectAttempts + "/" + config.maxReconnectAttempts);

    // 先关旧连接
    try { if (ws) ws.close(); } catch (e) {}
    ws = null;

    setTimeout(function () {
      initWebSocket();
    }, config.reconnectInterval);
}

// ========== 截图并发送 ==========
function sendScreenshot() {
    if (!ws || !state.connected) {
      print.log("跳过截图:未连接");
      return;
    }
    try {
      print.log("&#128248; 截取屏幕...");
      printl("&#128248; 截图中...");

      var screenshot = screen.screenShotFull();
      if (!screenshot) { printl("❌ 截图失败"); return; }

      print.log("&#128260; 转 Base64...");
      var base64Data = "" + screenshot.toBase64();   // 强转成 JS 字符串

      var sizeChars = base64Data.length;
      var sizeKB = Math.round((sizeChars * 0.75) / 1024);   // 粗略估算真实字节
      printl("&#128230; 图片大小: " + sizeChars + " 字符(约 " + sizeKB + " KB)");

      try { screenshot.recycle(); } catch (e) {}   // 释放 Java Bitmap 内存

      state.totalSent++;
      printl("&#128228; 发送图片 #" + state.totalSent + " ...");
      ws.send(base64Data);
      state.imgCount++;
      printl("✅ 已发送图片 #" + state.totalSent + "(" + sizeKB + " KB)");

    } catch (e) {
      printl("❌ 发送截图出错: " + e.message);
      print.log("sendScreenshot 异常: " + e.message);
    }
}

// ========== 定时截图定时器 ==========
function startScreenshotTimer() {
    if (screenshotTimer) { try { clearInterval(screenshotTimer); } catch (e) {} }

    print.log("启动定时截图,间隔 " + config.screenshotInterval + " 毫秒");
    printl("⏰ 定时截图已启动(间隔 " + (config.screenshotInterval / 1000) + " 秒)");

    // 立即发第一张
    setTimeout(function () { sendScreenshot(); }, 300);

    screenshotTimer = setInterval(function () {
      if (state.connected) sendScreenshot();
    }, config.screenshotInterval);
}

function stopScreenshotTimer() {
    if (screenshotTimer) {
      try { clearInterval(screenshotTimer); } catch (e) {}
      screenshotTimer = null;
      print.log("停止定时截图");
    }
}

// ========== 关闭连接 ==========
function disconnectWebSocket() {
    stopScreenshotTimer();
    if (ws) {
      try { ws.close(); } catch (e) {}
      ws = null;
    }
    state.connected = false;
    state.closed = true;
    printl("&#128268; 已关闭连接");
}

// ========== 主程序入口 ==========
function main() {
    try {
      printl("========================================");
      printl("WebSocket 屏幕截图传输 - 原生版");
      printl("服务器: " + config.serverUrl);
      printl("总运行: " + (config.runDuration / 1000) + " 秒    截图间隔: " + (config.screenshotInterval / 1000) + " 秒");
      printl("连接API: setSocketID → event(4回调) → connet → send → close");
      printl("========================================");
      printl("ℹ️ 确保 PC 已运行: python WebSocket测试服务器");

      // 启动连接(带异步重试)
      initWebSocket();

      // 总运行时长倒计时
      print.log("运行 " + (config.runDuration / 1000) + " 秒后自动结束");
      printl("⏳ 运行 " + (config.runDuration / 1000) + " 秒后自动结束");
      sleep.millisecond(config.runDuration);

      // 结束
      disconnectWebSocket();

      printl("");
      printl("===== 执行结束 =====");
      printl("尝试发送: " + state.totalSent + " 张");
      printl("计数显示: " + state.imgCount + " 张");
      if (state.saveDir) printl("PC 保存目录: " + state.saveDir);
      print.log("===== 屏幕截图传输结束,发送 " + state.totalSent + " 张 =====");

    } catch (e) {
      print.log("主程序异常: " + e.message);
      printl("❌ 程序错误: " + e.message);
      try { disconnectWebSocket(); } catch (e2) {}
    }
}

main();


页: [1]
查看完整版本: 本地调试版原生websocket版