|
|
WebSocketµ÷ÊÔokhttp°æ
- /**
- * WebSocket ÆÁÄ»½ØÍ¼´«Êä - ±¾µØµ÷Ê԰棨okhttp3 °æ£©
- *
- * ÅäÌ× WebSocket²âÊÔ·þÎñÆ÷.py ʹÓÃ
- *
- * ʹÓ÷½·¨£º
- *
- * È·ÈÏÏÂÃæ serverUrl ÀïµÄ IP ÊÇ PC µÄ¾ÖÓòÍø IP
- * ÊÖ»úºÍ PC ÔÚͬһ WiFi ¾ÖÓòÍø
- * AIWROK ÀïÔËÐб¾½Å±¾
- *
- * ±¾´ÎʹÓà okhttp3 µÄ WebSocketListener£¨·Ç AIWROK ÔÉú websocket ¶ÔÏó£©
- * ÒÑÔÚ AIWROK v3.7.81 ʵ¼ÊÅÜͨ
- */
- // ========== µ¼Èë okhttp3£¨AIWROK ×Ô´øÕâЩ Java Àࣩ ==========
- importClass(Packages.okhttp3.OkHttpClient);
- importClass(Packages.okhttp3.Request);
- importClass(Packages.okhttp3.WebSocketListener);
- importClass(Packages.java.util.concurrent.TimeUnit);
- print.log("===== WebSocket ÆÁÄ»½ØÍ¼´«Ê䣨okhttp3 °æ£©¿ªÊ¼ =====");
- // ========== ÅäÖÃ ==========
- var config = {
- serverUrl: "192.168.10.107:8886", // ¡û ¸Ä³É PC ¾ÖÓòÍø IP:¶Ë¿Ú
- screenshotInterval: 5000, // ½ØÍ¼¼ä¸ô£¨ºÁÃ룩
- reconnectInterval: 2500, // ¶ÏÏßÖØÊÔ¼ä¸ô£¨ºÁÃ룩
- maxReconnectAttempts: 12, // ×î¶àÖØÊÔ´ÎÊý
- connectTimeoutSec: 15, // ÎÕÊÖ³¬Ê±£¨Ã룩
- readTimeoutSec: 30, // ¶Á³¬Ê±£¨Ã룩
- runDuration: 30000 // ½Å±¾×ÜÔËÐÐʱ³¤£¨ºÁÃ룩
- };
- // ========== È«¾Ö״̬ ==========
- var okHttpClient = null; // OkHttpClient
- var webSocket = null; // µ±Ç° WebSocket ¶ÔÏó
- var timer = null; // ¶¨Ê±Æ÷
- var state = {
- connected: false, // ÊÇ·ñÒÑÁ¬½Ó
- err: null, // ×î½ü´íÎó
- closeReason: null, // ¹Ø±ÕÔÒò
- reconnectCount: 0, // ÒÑÖØÁ¬´ÎÊý
- saveDir: "", // ÓÉ·þÎñÆ÷ WELCOME ´ø³ö
- saveUrlPrefix: "", // file:/// ǰ׺
- totalSent: 0, // Òѳ¢ÊÔ·¢Ë͵ÄͼƬÊý
- totalConfirmed: 0 // ·þÎñÆ÷È·ÈÏÊÕµ½µÄͼƬÊý
- };
- // ========== ¹¤¾ß£º½âÎö·þÎñÆ÷½á¹¹»¯ÏûÏ¢ ==========
- function parseServerMessage(rawStr) {
- if (typeof rawStr !== "string") { try { rawStr = String(rawStr); } catch (e) { rawStr = "" + rawStr; } }
- var result = { type: "UNKNOWN", raw: rawStr };
- if (rawStr.indexOf("WELCOME|") === 0) {
- result.type = "WELCOME";
- var parts = rawStr.split("|");
- result.id = parts[1] || "";
- for (var i = 2; i < parts.length; i++) {
- var idx = parts[i].indexOf("=");
- if (idx > 0) result[parts[i].substring(0, idx)] = parts[i].substring(idx + 1);
- }
- } else if (rawStr.indexOf("IMG_SAVED|") === 0) {
- result.type = "IMG_SAVED";
- var p = rawStr.split("|");
- result.seq = p[1] || "";
- result.sizeTxt = p[2] || "";
- result.absPath = p[3] || "";
- result.fileUrl = p[4] || "";
- } else if (rawStr.indexOf("IMG_FAIL|") === 0) {
- result.type = "IMG_FAIL";
- } else if (rawStr.indexOf("ECHO|") === 0) {
- result.type = "ECHO";
- result.text = rawStr.substring("ECHO|".length);
- }
- return result;
- }
- // ========== ÊÍ·Å×ÊÔ´£¨Ã¿´ÎÖØÁ¬Ç°ÇåÀí¾É client£© ==========
- function shutdownClient() {
- if (webSocket) {
- try { webSocket.close(1000, "shutdown"); } catch (e) {}
- webSocket = null;
- }
- if (okHttpClient) {
- try { okHttpClient.dispatcher().executorService().shutdownNow(); } catch (e) {}
- okHttpClient = null;
- }
- }
- // ========== ½¨Á¢Á¬½Ó£¨okhttp3 ·½°¸£© ==========
- function connect() {
- // ÏÈÇå¾É×ÊÔ´
- shutdownClient();
- state.connected = false;
- state.err = null;
- // ¹¹ÔìРOkHttpClient
- okHttpClient = new OkHttpClient.Builder()
- .pingInterval(10, TimeUnit.SECONDS)
- .connectTimeout(config.connectTimeoutSec, TimeUnit.SECONDS)
- .readTimeout(config.readTimeoutSec, TimeUnit.SECONDS)
- .build();
- // ¹¹Ôì listener
- var listener = new WebSocketListener({
- onOpen: function (wsObj, response) {
- state.connected = true;
- state.err = null;
- state.reconnectCount = 0;
- print.log("WS: onOpen");
- printl("✅ Á¬½Ó³É¹¦£¨onOpen£©");
- startScreenshotLoop();
- },
- onMessage: function (wsObj, message) {
- var raw;
- try { raw = String(message); } 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") {
- state.totalConfirmed++;
- printl("💾 ·þÎñÆ÷Òѱ£´æÍ¼Æ¬ " + parsed.seq);
- printl(" ´óС: " + parsed.sizeTxt);
- printl(" ·¾¶: " + parsed.absPath);
- printl(" 🔗 " + parsed.fileUrl);
- } else if (parsed.type === "IMG_FAIL") {
- printl("🔴 ·þÎñÆ÷±£´æÍ¼Æ¬Ê§°Ü: " + parsed.raw);
- } else if (parsed.type === "ECHO") {
- printl("📩 »ØÏÔ: " + parsed.text.substring(0, 150));
- } else {
- // δ֪¸ñʽ£¨¾É°æ·þÎñÆ÷·µ»Ø£©
- printl("📩 ÊÕµ½: " + raw.substring(0, 200) + (raw.length > 200 ? "..." : ""));
- }
- },
- onClosed: function (wsObj, code, reason) {
- state.connected = false;
- state.closeReason = reason || "closed";
- print.log("WS: onClosed code=" + code + " reason=" + reason);
- printl("🔌 Á¬½Ó¹Ø±Õ£¨onClosed code=" + code + "£©");
- stopScreenshotLoop();
- scheduleReconnect();
- },
- onFailure: function (wsObj, throwable, response) {
- state.connected = false;
- state.err = (throwable ? String(throwable.getMessage()) : "unknown_failure");
- print.log("WS: onFailure " + state.err);
- printl("❌ Á¬½Ó´íÎó£¨onFailure£©: " + state.err);
- stopScreenshotLoop();
- scheduleReconnect();
- }
- });
- // ·¢ÆðÁ¬½Ó
- var url = "ws://" + config.serverUrl;
- printl("ÕýÔÚÁ¬½Ó: " + url + "£¨" + config.connectTimeoutSec + " Ã볬ʱ£©");
- try {
- var request = new Request.Builder().url(url).build();
- webSocket = okHttpClient.newWebSocket(request, listener);
- } catch (e) {
- state.err = String(e.message);
- printl("❌ newWebSocket Å×Òì³£: " + state.err);
- scheduleReconnect();
- }
- // ͬ²½µÈ×î¶à connectTimeoutSec + 5 Ã뿴ʼþ
- var waited = 0;
- while (!state.connected && !state.err && waited < (config.connectTimeoutSec + 5) * 1000) {
- sleep.millisecond(100);
- waited += 100;
- }
- if (!state.connected && !state.err) {
- state.err = "Á¬½Ó³¬Ê±£¨" + (config.connectTimeoutSec + 5) + " ÃëÄÚÎÞ onOpen/onFailure£©";
- printl("❌ " + state.err);
- scheduleReconnect();
- }
- }
- // ========== ÖØÁ¬µ÷¶È ==========
- function scheduleReconnect() {
- if (state.reconnectCount >= config.maxReconnectAttempts) {
- printl("🛑 ÒÑ´ïµ½×î´óÖØÁ¬´ÎÊý " + config.maxReconnectAttempts + "£¬Í£Ö¹");
- return;
- }
- state.reconnectCount++;
- printl("⏱️ ÖØÁ¬ " + state.reconnectCount + "/" + config.maxReconnectAttempts + "£¬" + (config.reconnectInterval / 1000).toFixed(1) + " Ãëºó...");
- shutdownClient();
- setTimeout(function () {
- connect();
- }, config.reconnectInterval);
- }
- // ========== ½ØÒ»ÕÅͼ²¢·¢ËÍ ==========
- function sendOne() {
- if (!state.connected || !webSocket) {
- print.log("Ìø¹ý½ØÍ¼£ºÎ´Á¬½Ó");
- return;
- }
- try {
- print.log("½ØÈ¡ÆÁÄ»...");
- printl("📸 ½ØÍ¼ÖÐ...");
- var bitmap = screen.screenShotFull();
- if (!bitmap) { printl("❌ ½ØÍ¼Ê§°Ü£¨·µ»Ø null£©"); return; }
- print.log("ת Base64...");
- var base64 = "" + bitmap.toBase64(); // Java ByteString ¡ú JS ×Ö·û´®£¬±ØÐëÓà ""+
- if (!base64) { printl("❌ Base64 Ϊ¿Õ"); return; }
- var chars = base64.length;
- var estKB = Math.round(chars * 0.75 / 1024);
- printl("📦 ͼƬ´óС: " + chars + " ×Ö·û£¨Ô¼ " + estKB + " KB£©");
- try { bitmap.recycle(); } catch (e) {}
- state.totalSent++;
- printl("📤 ·¢ËÍͼƬ #" + state.totalSent + " ...");
- webSocket.send(base64);
- printl("✅ ͼƬ #" + state.totalSent + " ÒÑͶµÝ£¨" + estKB + " KB£©");
- } catch (e) {
- printl("❌ sendOne Òì³£: " + e.message);
- print.log("sendOne: " + e.message);
- }
- }
- // ========== ¶¨Ê±½ØÍ¼Ñ»· ==========
- function startScreenshotLoop() {
- if (timer) { try { clearInterval(timer); } catch (e) {} timer = null; }
- print.log("¶¨Ê±½ØÍ¼Ñ»·Æô¶¯, ¼ä¸ô " + config.screenshotInterval + "ms");
- printl("⏰ ¶¨Ê±½ØÍ¼ÒÑÆô¶¯£¨¼ä¸ô " + (config.screenshotInterval / 1000) + " Ã룩");
- // Ê×ÕÅÁ¢¼´À´
- setTimeout(function () { sendOne(); }, 300);
- timer = setInterval(function () {
- if (state.connected && webSocket) sendOne();
- }, config.screenshotInterval);
- }
- function stopScreenshotLoop() {
- if (timer) {
- try { clearInterval(timer); } catch (e) {}
- timer = null;
- print.log("Í£Ö¹¶¨Ê±½ØÍ¼Ñ»·");
- }
- }
- // ========== ¹Ø±ÕÇåÀí ==========
- function cleanup() {
- stopScreenshotLoop();
- shutdownClient();
- state.connected = false;
- printl("🔌 ×ÊÔ´ÒÑÇåÀí");
- }
- // ========== Ö÷³ÌÐò ==========
- function main() {
- try {
- printl("========================================");
- printl(" WebSocket ÆÁÄ»½ØÍ¼´«Êä - okhttp3 °æ");
- printl(" ·þÎñÆ÷: " + config.serverUrl);
- printl(" ½ØÍ¼¼ä¸ô: " + (config.screenshotInterval / 1000) + " Ãë");
- printl(" ×ÜÔËÐÐ: " + (config.runDuration / 1000) + " Ãë");
- printl(" ×î´óÖØÁ¬: " + config.maxReconnectAttempts + " ´Î");
- printl("========================================");
- printl("ℹ️ ÇëÈ·ÈÏ PC ÒÑÔËÐÐ: python WebSocket²âÊÔ·þÎñÆ÷.py");
- connect();
- print.log("µ¹¼ÆÊ± " + (config.runDuration / 1000) + " Ãë...");
- printl("⏳ ÔËÐÐ " + (config.runDuration / 1000) + " Ãëºó×Ô¶¯½áÊø");
- sleep.millisecond(config.runDuration);
- cleanup();
- printl("");
- printl("===== Ö´ÐнáÊø =====");
- printl(" ³¢ÊÔ·¢ËÍ: " + state.totalSent + " ÕÅ");
- printl(" ·þÎñÆ÷È·ÈÏ: " + state.totalConfirmed + " ÕÅ");
- if (state.saveDir) printl(" PC ±£´æÄ¿Â¼: " + state.saveDir);
- print.log("===== ÆÁÄ»½ØÍ¼´«Êä½áÊø, ·¢ËÍ " + state.totalSent + " ÕÅ =====");
- } catch (e) {
- print.log("Ö÷³ÌÐòÒì³£: " + e.message);
- printl("❌ ³ÌÐò´íÎó: " + e.message);
- try { cleanup(); } catch (e2) {}
- }
- }
- main();
¸´ÖÆ´úÂë
|
|