本地调试版原生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("📩 WELCOME " + parsed.id);
if (state.saveDir) {
printl("📁 保存目录: " + state.saveDir);
printl("🔗 目录URL: " + state.saveUrlPrefix);
}
} else if (parsed.type === "IMG_SAVED") {
printl("💾 PC 已保存图片 " + parsed.seq);
printl(" 大小: " + parsed.sizeTxt);
printl(" 路径: " + parsed.absPath);
printl(" � " + parsed.fileUrl);
} else if (parsed.type === "IMG_FAIL") {
printl("🔴 服务器保存失败: " + raw);
} else if (parsed.type === "ECHO") {
printl("📩 回显: " + parsed.text.substring(0, 150));
} else {
printl("📩 收到: " + 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("🛑 已达到最大重连次数 " + 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("📸 截取屏幕...");
printl("📸 截图中...");
var screenshot = screen.screenShotFull();
if (!screenshot) { printl("❌ 截图失败"); return; }
print.log("🔄 转 Base64...");
var base64Data = "" + screenshot.toBase64(); // 强转成 JS 字符串
var sizeChars = base64Data.length;
var sizeKB = Math.round((sizeChars * 0.75) / 1024); // 粗略估算真实字节
printl("📦 图片大小: " + sizeChars + " 字符(约 " + sizeKB + " KB)");
try { screenshot.recycle(); } catch (e) {} // 释放 Java Bitmap 内存
state.totalSent++;
printl("📤 发送图片 #" + 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("🔌 已关闭连接");
}
// ========== 主程序入口 ==========
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]