|
|
±¾µØµ÷ÊÔ°æÔÉú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[1] || "";
- for (var i = 2; i < parts.length; i++) {
- var eqIdx = parts[i].indexOf("=");
- if (eqIdx > 0) out[parts[i].substring(0, eqIdx)] = parts[i].substring(eqIdx + 1);
- }
- } else if (raw.indexOf("IMG_SAVED|") === 0) {
- out.type = "IMG_SAVED";
- var p = raw.split("|");
- out.seq = p[1] || "";
- out.sizeTxt = p[2] || "";
- out.absPath = p[3] || "";
- out.fileUrl = p[4] || "";
- } 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();
¸´ÖÆ´úÂë
|
|