B2BÍøÂçÈí¼þ

 ÕÒ»ØÃÜÂë
 Á¢¼´×¢²á ÉóºËÍøÕ¾ºÅ:QQ:896757558
ËÑË÷
²é¿´: 2|»Ø¸´: 0
´òÓ¡ ÉÏÒ»Ö÷Ìâ ÏÂÒ»Ö÷Ìâ

AIWROKÊÖ»úÖ¸»Ǫֹ́ͣÓ뿪ʼִÐÐÆ÷

[¸´ÖÆÁ´½Ó]

1168

Ö÷Ìâ

1173

Ìû×Ó

7949

»ý·Ö

abc

Rank: 9Rank: 9Rank: 9

»ý·Ö
7949
Ìø×ªµ½Ö¸¶¨Â¥²ã
Â¥Ö÷


AIWROKÊÖ»úÖ¸»Ǫֹ́ͣÓ뿪ʼִÐÐÆ÷
AIWROKÊÖ»úÖ¸»Ǫֹ́ͣÓ뿪ʼִÐÐÆ÷ B2BÍøÂçÈí¼þ

AIWROKÊÖ»úÖ¸»Ǫֹ́ͣÓ뿪ʼִÐÐÆ÷ B2BÍøÂçÈí¼þ

AIWROKÊÖ»úÖ¸»Ǫֹ́ͣÓ뿪ʼִÐÐÆ÷ B2BÍøÂçÈí¼þ

AIWROKÊÖ»úÖ¸»Ǫֹ́ͣÓ뿪ʼִÐÐÆ÷ B2BÍøÂçÈí¼þ

AIWROKÊÖ»úÖ¸»Ǫֹ́ͣÓ뿪ʼִÐÐÆ÷ B2BÍøÂçÈí¼þ

  1. https://www.yuque.com/aiwork/nba2pr/ssiowosqrnpscnef
¸´ÖÆ´úÂë




  1. /**
  2. * AIWROK ÊÖ»úÖ´ÐÐÆ÷£¨MQTT Ⱥ¿Ø¶Ë ¡¤ ÔöÇ¿°æ£©
  3. * ------------------------------------------------------------------
  4. * ÅäÌ×£ºÖ¸»Ǫ́.html£¨µçÄÔä¯ÀÀÆ÷´ò¿ª£©
  5. *
  6. * Ö÷ÌâÔ¼¶¨£¨ROOM »»³ÉÄã×Ô¼ºµÄ·¿¼äºÅ£¬±ÜÃâºÍ±ðÈË´®Ì¨£©
  7. *   ÊÕ£ºaiwrok/<ROOM>/cmd/<±¾»ú»úºÅ>     Ö»·¢¸øÄ³Ò»Ì¨
  8. *   ÊÕ£ºaiwrok/<ROOM>/cmd/all            ¹ã²¥£¬ËùÓлúÆ÷¶¼Ö´ÐÐ
  9. *   ·¢£ºaiwrok/<ROOM>/ret/<±¾»ú»úºÅ>     ÐÄÌø + Ö´Ðнá¹û + ½ØÍ¼
  10. *
  11. * Ö¸ÁîÇåµ¥£¨JSON£¬´ø "id" µÄ»ØÖ´»áÔ­Ñù´ø»Ø£¬µçÄÔ¶ËÓÃÀ´ËãºÄʱ£©
  12. *   {"cmd":"PING"}                                   ²âÁ¬Í¨
  13. *   {"cmd":"INFO"}                                   ÍêÕû»·¾³¿ìÕÕ
  14. *   {"cmd":"STATUS"}                                 ÔËÐÐ״̬
  15. *   {"cmd":"SHOT","w":540,"q":60}                    ½ØÍ¼»Ø´«(¿ÉÁÙʱ¸ÄËõ·Å/ÖÊÁ¿)
  16. *   {"cmd":"CLICK","x":540,"y":960}                  µã×ø±ê
  17. *   {"cmd":"SWIPE","x1":540,"y1":1400,"x2":540,"y2":500,"ms":300}   »¬¶¯
  18. *   {"cmd":"TEXT","text":"ÄãºÃ"}                      ÊäÈë(sendString)
  19. *   {"cmd":"CLIP","text":"ÄãºÃ"}                      ÊäÈë(¼ôÌù°å+³¤°´Õ³Ìù)
  20. *   {"cmd":"FIND","text":"µãÔÞ","tap":1}              °´ÆÁÄ»ÎÄ×ÖÕÒ£¬ÕÒµ½¾Íµã
  21. *   {"cmd":"APP","pkg":"com.tencent.mm"}             ´ò¿ªÓ¦ÓÃ
  22. *   {"cmd":"HOME"} / {"cmd":"BACK"}
  23. *   {"cmd":"WAIT","ms":3000}                         µÈ´ý
  24. *   {"cmd":"LOOP","act":"SWIPE","count":30,"min":2000,"max":2000}   Ñ­»·
  25. *   {"cmd":"STOP"}                                   Í£Ñ­»·
  26. *   {"cmd":"RAND","on":1,"px":20}                    Ëæ»úÆ«ÒÆ¿ª¹Ø(·À·ç¿Ø)
  27. *   {"cmd":"TASK","steps":[{"cmd":"APP","pkg":"..."},{"cmd":"WAIT","ms":4000},{"cmd":"SWIPE"},{"cmd":"FIND","text":"µãÔÞ"}]}
  28. *                                                    ÈÎÎñ±àÅÅ£º°´Ë³ÐòÅÜÒ»ÕûÌ×
  29. *   {"cmd":"SELFTEST"}                               Ò»¼ü×Լ죺ÖðÏîÌå¼ì±¨ pass/fail
  30. * ------------------------------------------------------------------
  31. * ÈÕÖ¾£ºÃ¿ÌõÖ¸Áî¶¼´ò ÐòºÅ/À´Ô´/²ÎÊý/ºÄʱ/½á¹û/»Ø´«×Ö½Ú£¬Ñ­»·ºÍÈÎÎñÿ²½¶¼´ò£¬
  32. *       ¾ø²»¾²Ä¬Ö´ÐС£
  33. * ------------------------------------------------------------------
  34. */

  35. // ==================== ÅäÖãºÖ»¸ÄÕâÈýÐÐ ====================
  36. var ROOM      = "room001";                 // ·¿¼äºÅ£¬¶ą̀µçÄÔ/¶àÌ×É豸ÓÃËü¸ôÀë
  37. var DEV_ID    = "";                        // »úºÅ£¬Áô¿Õ=×Ô¶¯Óà IMEI ºó 6 λ
  38. var BROKER    = "tcp://broker.emqx.io:1883";
  39. var SHOT_MAXW = 540;      // »Ø´«½ØÍ¼×î´ó¿í¶È£¬³¬³öµÈ±ÈËõС
  40. var SHOT_QUAL = 60;       // JPEG ÖÊÁ¿ 1-100£¬µ÷С¸üÊ¡Á÷Á¿¸ü²»Ò×µôÏß
  41. var VER       = "v6";     // °æ±¾ºÅ£¬ÈÕÖ¾ÀïÄÜ¿´µ½ÅܵÄÊÇÄİæ
  42. // ========================================================

  43. var T = { cmdMine: "", cmdAll: "", ret: "" };

  44. // ---------- ÈÕÖ¾ ----------
  45. // ÖØÒª£ºprintl Ö»ÄÜÔڽű¾Ö÷Ï̵߳÷Óá£Paho µÄ»Øµ÷£¨ÊÕÏûÏ¢/µôÏߣ©ÅÜÔÚ±ðµÄ
  46. // Java Ïß³ÌÉÏ£¬ÔÚÄÇÀïÖ±½Ó printl »áÅ×Òì³£²¢´òËÀÏûÏ¢ÅÉ·¢Ị̈߳¬±íÏÖΪ
  47. // "Ö»ÊÕµ½µÚÒ»ÌõÖ¸Á֮ºóÈ«²¿¶ªÊ§£¬×îºó 32000 ³¬Ê±µôÏß"¡£
  48. var IN_CALLBACK = false;
  49. var LOGQ = [];

  50. function log(s) {
  51.     if (IN_CALLBACK) {
  52.         if (LOGQ.length < 800) LOGQ.push(s);   // »Øµ÷Ị̈߳ºÖ»Èë¶Ó£¬¾ø²» printl
  53.     } else {
  54.         try { printl("[Ö´ÐÐÆ÷] " + s); } catch (e) {}
  55.     }
  56. }
  57. function logk(s) { log(s); }                   // ¹Ø¼ü½Úµã£¬Ð´·¨Í³Ò»·½±ã¹ýÂË

  58. function flushLog() {
  59.     var n = 0;
  60.     while (LOGQ.length > 0 && n < 40) {
  61.         try { printl("[Ö´ÐÐÆ÷] " + LOGQ.shift()); } catch (e) { LOGQ.length = 0; break; }
  62.         n++;
  63.     }
  64. }

  65. // ==================== 1. ¼ÓÔØ Paho ====================
  66. try {
  67.     rhino.loadDex("paho-mqtt.dex");
  68.     log("[1/6] dex ÒѼÓÔØ paho-mqtt.dex");
  69. } catch (e) {
  70.     log("[1/6] loadDex Ìø¹ý£¨¿ÉÄÜϵͳÒÑ×Ô¶¯¼ÓÔØ²å¼þ£©£º" + e.message);
  71. }

  72. try {
  73.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttClient);
  74.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttConnectOptions);
  75.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttCallback);
  76.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttMessage);
  77.     importClass(Packages.org.eclipse.paho.client.mqttv3.persist.MemoryPersistence);
  78.     log("[2/6] Paho ÀർÈë³É¹¦");
  79. } catch (e) {
  80.     log("[2/6] Paho ÀർÈëʧ°Ü£º" + e.message);
  81.     log("      Çë°Ñ paho-mqtt.dex ·Åµ½±¾¹¤³ÌµÄ ²å¼þ\\ Ŀ¼ºóÖØÅÜ");
  82.     exit();
  83. }

  84. // ==================== 2. É豸ÐÅÏ¢ ====================
  85. function deviceInfo() {
  86.     var o = { brand: "?", model: "?", imei: "", w: 0, h: 0, android: "?", sdk: "?" };
  87.     try { o.brand = "" + device.getBrand(); } catch (e) {}
  88.     try { o.model = "" + device.getModel(); }  catch (e) {}
  89.     try { o.imei  = "" + device.getIMEI(); }   catch (e) {}
  90.     try { o.w = screen.getScreenWidth(); o.h = screen.getScreenHeight(); } catch (e) {}
  91.     try { o.android = "" + java.lang.System.getProperty("os.version"); } catch (e) {}
  92.     try { o.sdk = "" + Packages.android.os.Build.VERSION.SDK_INT; } catch (e) {}
  93.     return o;
  94. }
  95. var INFO = deviceInfo();
  96. if (!DEV_ID) {
  97.     DEV_ID = INFO.imei ? ("" + INFO.imei).slice(-6) : ("dev" + Math.floor(Math.random() * 10000));
  98. }
  99. DEV_ID = "" + DEV_ID;
  100. T.cmdMine = "aiwrok/" + ROOM + "/cmd/" + DEV_ID;
  101. T.cmdAll  = "aiwrok/" + ROOM + "/cmd/all";
  102. T.ret     = "aiwrok/" + ROOM + "/ret/" + DEV_ID;

  103. // ==================== 3. ״̬ ====================
  104. var client = null, connected = false;
  105. var startAt = (new Date()).getTime();
  106. var nRecv = 0, nSent = 0, nRun = 0, nErr = 0;
  107. var loopOn = false, loopTotal = 0, loopTimes = 0;
  108. var taskOn = false, taskStep = 0, taskTotal = 0;
  109. var CMDQ = [];                              // »Øµ÷Ïß³ÌÈë¶Ó£¬Ö÷Ïß³ÌÖ´ÐÐ
  110. var randOn = 0, randPx = 20;                // Ëæ»úÆ«ÒÆ£¨·À·ç¿Ø£©

  111. // ==================== 4. »Ø´« ====================
  112. function report(obj, retain) {
  113.     if (!connected) { log("»Ø´«¶ªÆú(δÁ¬½Ó) type=" + obj.type); return; }
  114.     try {
  115.         obj.dev = DEV_ID; obj.room = ROOM; obj.ver = VER;
  116.         obj.brand = INFO.brand; obj.model = INFO.model;
  117.         obj.screen = INFO.w + "x" + INFO.h;
  118.         obj.ts = (new Date()).getTime();
  119.         var body = JSON.stringify(obj);
  120.         var m = new MqttMessage();
  121.         m.setPayload(new java.lang.String(body).getBytes("UTF-8"));
  122.         m.setQos(retain ? 1 : 0);
  123.         if (retain) m.setRetained(true);
  124.         client.publish(T.ret, m);
  125.         nSent++;
  126.         log("¡ú »Ø´« " + T.ret + " type=" + obj.type +
  127.             (obj.cmd ? ("/" + obj.cmd) : "") + " ×Ö½Ú=" + body.length);
  128.     } catch (e) { nErr++; log("»Ø´«Ê§°Ü£º" + e.message); }
  129. }

  130. // ==================== 5. »ù´¡¶¯×÷ ====================
  131. function jitter(v) {
  132.     if (!randOn) return v;
  133.     var d = Math.floor(Math.random() * (randPx * 2 + 1)) - randPx;
  134.     var r = v + d;
  135.     if (r < 1) r = 1;
  136.     return r;
  137. }
  138. function doClick(x, y) {
  139.     var jx = jitter(x), jy = jitter(y);
  140.     auto.clickPoint(jx, jy);
  141.     return { x: jx, y: jy, raw: x + "," + y, rand: randOn ? 1 : 0 };
  142. }
  143. function doSwipe(o) {
  144.     var x1 = jitter(o.x1 || Math.floor(INFO.w / 2)),     y1 = jitter(o.y1 || Math.floor(INFO.h * 0.75));
  145.     var x2 = jitter(o.x2 || Math.floor(INFO.w / 2)),     y2 = jitter(o.y2 || Math.floor(INFO.h * 0.25));
  146.     var ms = o.ms || 300;
  147.     auto.swip(x1, y1, x2, y2, ms, 0);
  148.     return { x1: x1, y1: y1, x2: x2, y2: y2, ms: ms, rand: randOn ? 1 : 0 };
  149. }
  150. function doText(t) {
  151.     input.sendString(t);
  152.     return { len: ("" + t).length, way: "sendString" };
  153. }
  154. // ¼ôÌù°åÊäÈ룺sendString ²»ÉúЧʱÓÃËü£¨ÐèÊäÈë¿òÒѾ۽¹£¬ÔÙ³¤°´Ñ¡"Õ³Ìù"£©
  155. function doClip(t) {
  156.     var s = "" + t;
  157.     try {
  158.         if (typeof Clipboard !== "undefined" && Clipboard && typeof Clipboard.copy === "function") {
  159.             Clipboard.copy(s);
  160.             return { len: s.length, way: "Clipboard.copy" };
  161.         }
  162.     } catch (e1) { throw new Error("Clipboard.copy ʧ°Ü£º" + e1.message); }
  163.     try {
  164.         if (typeof clipboard !== "undefined" && clipboard && typeof clipboard.copy === "function") {
  165.             clipboard.copy(s);
  166.             return { len: s.length, way: "clipboard.copy" };
  167.         }
  168.     } catch (e2) { throw new Error("clipboard.copy ʧ°Ü£º" + e2.message); }
  169.     throw new Error("±¾»úÎÞ¼ôÌù°å½Ó¿Ú£¨Clipboard/clipboard ¶¼²»¿ÉÓã©£¬Çë¸ÄÓà TEXT");
  170. }
  171. function doShot(maxW, qual) {
  172.     var mw = maxW || SHOT_MAXW, qq = qual || SHOT_QUAL;
  173.     var bmp = screen.screenShotFull();
  174.     if (!bmp) throw new Error("½ØÍ¼·µ»Ø¿Õ");
  175.     var b64 = null;
  176.     try {
  177.         var w = bmp.getWidth(), h = bmp.getHeight();
  178.         var target = bmp, from = null;
  179.         try {
  180.             if (w > mw) {
  181.                 var sc = mw / w;
  182.                 var mx = new Packages.android.graphics.Matrix();
  183.                 mx.postScale(sc, sc);
  184.                 target = Packages.android.graphics.Bitmap.createBitmap(bmp, 0, 0, w, h, mx, true);
  185.                 from = target;
  186.             }
  187.         } catch (eScale) { target = bmp; }
  188.         var bos = new java.io.ByteArrayOutputStream();
  189.         target.compress(Packages.android.graphics.Bitmap.CompressFormat.JPEG, qq, bos);
  190.         b64 = "" + Packages.android.util.Base64.encodeToString(bos.toByteArray(),
  191.                 Packages.android.util.Base64.NO_WRAP);
  192.         if (from) { try { from.recycle(); } catch (e2) {} }
  193.     } catch (e) {
  194.         try { b64 = "" + bmp.toBase64(); } catch (e5) { b64 = null; }
  195.     }
  196.     if (!b64 || b64.length < 32) {
  197.         try { bmp.recycle(); } catch (e3) {}
  198.         throw new Error("½ØÍ¼±àÂëʧ°Ü");
  199.     }
  200.     try { bmp.recycle(); } catch (e4) {}
  201.     var kb = Math.round(b64.length / 1024);
  202.     if (kb > 400) throw new Error("½ØÍ¼ÈÔ¹ý´ó " + kb + "KB£¬µ÷С w »ò q");
  203.     return { img: b64, kb: kb };
  204. }
  205. function doApp(pkg) {
  206.     if (!pkg) throw new Error("ȱÉÙ pkg °üÃû");
  207.     app.openApp(pkg);
  208.     return { pkg: pkg };
  209. }
  210. function doHome() { auto.home(); return {}; }
  211. function doBack() {
  212.     if (typeof auto.back === "function") { auto.back(); return {}; }
  213.     throw new Error("´Ë°æ±¾ auto ÎÞ back()£¬¸ÄÓà CLICK µã·µ»Ø¼ü×ø±ê");
  214. }
  215. // °´ÆÁÄ»ÎÄ×Ö²éÕÒ£¬ÕÒµ½¾ÍµãÖÐÐÄ£¨ÒÀÀµ UI Ê÷£¬²¿·ÖÓ¦ÓöÁ²»µ½»á±¨Î´ÕÒµ½£©
  216. function doFind(text, tap) {
  217.     var xml = "";
  218.     try { xml = "" + agent.getXml(); }
  219.     catch (e) { throw new Error("¶ÁÈ¡½çÃæÊ§°Ü£º" + e.message); }
  220.     if (!xml || xml.length < 20) throw new Error("½çÃæÄÚÈÝΪ¿Õ");
  221.     var idx = xml.indexOf('text="' + text + '"');
  222.     if (idx < 0) { return { found: 0, text: text }; }
  223.     var seg = xml.substring(idx, idx + 600);
  224.     var bm = seg.match(/bounds="\[(-?\d+),(-?\d+)\]\[(-?\d+),(-?\d+)\]"/);
  225.     if (!bm) return { found: 1, tapped: 0, text: text, note: "ÕÒµ½µ«ÎÞ×ø±ê" };
  226.     var cx = Math.round(parseInt(bm[1], 10) + (parseInt(bm[3], 10) - parseInt(bm[1], 10)) / 2);
  227.     var cy = Math.round(parseInt(bm[2], 10) + (parseInt(bm[4], 10) - parseInt(bm[2], 10)) / 2);
  228.     var out = { found: 1, text: text, x: cx, y: cy, bounds: bm[0] };
  229.     if (tap === undefined || tap) { auto.clickPoint(cx, cy); out.tapped = 1; }
  230.     return out;
  231. }

  232. // ==================== 6. ͳһִÐÐÈë¿Ú£¨handle / TASK / SELFTEST ¶¼×ßÕâÀ ==========
  233. function execCmd(o) {
  234.     var cmd = (o.cmd || "").toUpperCase();
  235.     var res = { cmd: cmd, ok: false };
  236.     var t0 = (new Date()).getTime();

  237.     if (cmd === "PING")       { res.ok = true; res.msg = "pong"; }
  238.     else if (cmd === "INFO")  {
  239.         res.ok = true;
  240.         res.env = { brand: INFO.brand, model: INFO.model, imei: INFO.imei,
  241.                     screen: INFO.w + "x" + INFO.h, android: INFO.android, sdk: INFO.sdk,
  242.                     room: ROOM, dev: DEV_ID, ver: VER, broker: BROKER,
  243.                     sub: [T.cmdMine, T.cmdAll], pub: T.ret,
  244.                     shot: { maxW: SHOT_MAXW, qual: SHOT_QUAL }, rand: { on: randOn, px: randPx } };
  245.     }
  246.     else if (cmd === "STATUS"){
  247.         res.ok = true;
  248.         res.info = { up: Math.round(((new Date()).getTime() - startAt) / 1000),
  249.                      recv: nRecv, sent: nSent, run: nRun, err: nErr,
  250.                      loop: loopOn, loopTimes: loopTimes, loopTotal: loopTotal,
  251.                      task: taskOn, taskStep: taskStep, taskTotal: taskTotal,
  252.                      rand: randOn, connected: connected };
  253.     }
  254.     else if (cmd === "CLICK") { var px = parseInt(o.x, 10), py = parseInt(o.y, 10);
  255.                                 if (isNaN(px) || isNaN(py)) throw new Error("×ø±êÎÞЧ x=" + o.x + " y=" + o.y);
  256.                                 res.ok = true; res.data = doClick(px, py); }
  257.     else if (cmd === "SWIPE") { res.ok = true; res.data = doSwipe(o); }
  258.     else if (cmd === "TEXT")  { if (!o.text) throw new Error("ȱÉÙ text");
  259.                                 res.ok = true; res.data = doText(o.text); }
  260.     else if (cmd === "CLIP")  { if (!o.text) throw new Error("ȱÉÙ text");
  261.                                 res.ok = true; res.data = doClip(o.text); }
  262.     else if (cmd === "FIND")  { if (!o.text) throw new Error("ȱÉÙ text");
  263.                                 res.ok = true; res.data = doFind(o.text, o.tap); }
  264.     else if (cmd === "SHOT")  { var r = doShot(o.w, o.q);
  265.                                 res.ok = true; res.kb = r.kb; res.img = r.img; }
  266.     else if (cmd === "APP")   { res.ok = true; res.data = doApp(o.pkg); }
  267.     else if (cmd === "HOME")  { res.ok = true; doHome(); res.msg = "ÒÑ»Ø×ÀÃæ"; }
  268.     else if (cmd === "BACK")  { res.ok = true; doBack(); res.msg = "ÒÑ·µ»Ø"; }
  269.     else if (cmd === "WAIT")  { res.ok = true; res.wait = o.ms || 1000; }
  270.     else if (cmd === "RAND")  { randOn = o.on ? 1 : 0; randPx = o.px || randPx;
  271.                                 res.ok = true; res.msg = "Ëæ»úÆ«ÒÆ=" + (randOn ? ("¿ª " + randPx + "px") : "¹Ø"); }
  272.     else if (cmd === "STOP")  { loopOn = false; taskOn = false;
  273.                                 res.ok = true; res.msg = "ÒÑ·¢Í£Ö¹(Ñ­»·+ÈÎÎñ)"; }
  274.     else { throw new Error("δָ֪Áî " + cmd); }

  275.     res.ms = (new Date()).getTime() - t0;
  276.     return res;
  277. }

  278. // ==================== 7. ÈÎÎñ±àÅÅ£º°´Ë³ÐòÅÜÒ»×é²½Öè ====================
  279. function runTask(steps) {
  280.     if (!steps || !steps.length) throw new Error("steps Ϊ¿Õ");
  281.     taskOn = true; taskStep = 0; taskTotal = steps.length;
  282.     logk("ÈÎÎñ¿ªÊ¼ ¹² " + steps.length + " ²½£º" + JSON.stringify(steps).slice(0, 200));
  283.     report({ type: "TASK", state: "start", total: steps.length });

  284.     (function next(i) {
  285.         if (!taskOn) {
  286.             logk("ÈÎÎñÒÑÍ£Ö¹£¬Íê³É " + i + "/" + steps.length + " ²½");
  287.             report({ type: "TASK", state: "stop", step: i, total: steps.length });
  288.             return;
  289.         }
  290.         if (i >= steps.length) {
  291.             taskOn = false;
  292.             logk("ÈÎÎñÈ«²¿Íê³É£¬¹² " + steps.length + " ²½");
  293.             report({ type: "TASK", state: "done", step: steps.length, total: steps.length });
  294.             return;
  295.         }
  296.         var s = steps[i] || {};
  297.         taskStep = i + 1;
  298.         var one = { type: "TASK", state: "run", step: i + 1, total: steps.length, cmd: (s.cmd || "").toUpperCase() };
  299.         try {
  300.             var r = execCmd(s);
  301.             one.ok = r.ok; one.ms = r.ms;
  302.             if (r.data) one.data = r.data;
  303.             if (r.img) { report({ type: "SHOT", ok: true, kb: r.kb, img: r.img, step: i + 1 }); one.kb = r.kb; }
  304.             log("ÈÎÎñ µÚ" + (i + 1) + "/" + steps.length + "²½ " + one.cmd + " ³É¹¦ ºÄʱ=" + r.ms + "ms" +
  305.                 (r.data ? (" ²ÎÊý=" + JSON.stringify(r.data)) : ""));
  306.         } catch (e) {
  307.             nErr++;
  308.             one.ok = false; one.err = "" + e.message;
  309.             log("ÈÎÎñ µÚ" + (i + 1) + "/" + steps.length + "²½ " + one.cmd + " ʧ°Ü£º" + e.message);
  310.         }
  311.         report(one);
  312.         nRun++;
  313.         var wait = (one.cmd === "WAIT") ? (s.ms || 1000) : 300;
  314.         setTimeout(function () { next(i + 1); }, wait);
  315.     })(0);
  316. }

  317. // ==================== 8. Ò»¼ü×Լ죺ÖðÏîÌå¼ì ====================
  318. function runSelfTest() {
  319.     logk("×Լ쿪ʼ£¨7 Ï");
  320.     report({ type: "SELFTEST", state: "start" });
  321.     var items = [];
  322.     var plan = [
  323.         { name: "ÆÁÄ»·Ö±æÂÊ", run: function () {
  324.             if (!INFO.w || !INFO.h) throw new Error("¶Á²»µ½¿í¸ß");
  325.             return INFO.w + "x" + INFO.h; } },
  326.         { name: "½ØÍ¼ÄÜÁ¦", run: function () {
  327.             var r = doShot(320, 50); return r.kb + "KB"; } },
  328.         { name: "µã»÷ÄÜÁ¦", run: function () {
  329.             doClick(Math.floor(INFO.w / 2), Math.floor(INFO.h / 2)); return "ÒѵãÖÐÐÄ"; } },
  330.         { name: "»¬¶¯ÄÜÁ¦", run: function () {
  331.             doSwipe({}); return "ÒÑÉÏ»¬Ò»´Î"; } },
  332.         { name: "UIÊ÷¶ÁÈ¡", run: function () {
  333.             var x = "" + agent.getXml();
  334.             if (!x || x.length < 20) throw new Error("UIÊ÷Ϊ¿Õ");
  335.             return x.length + " ×Ö½Ú"; } },
  336.         { name: "MQTT»Ø´«", run: function () {
  337.             if (!connected) throw new Error("δÁ¬½Ó"); return "ÔÚÏß"; } },
  338.         { name: "Ëæ»úÆ«ÒÆ", run: function () {
  339.             return randOn ? ("¿ª " + randPx + "px") : "¹Ø"; } }
  340.     ];
  341.     (function one(i) {
  342.         if (i >= plan.length) {
  343.             var pass = 0;
  344.             for (var k = 0; k < items.length; k++) { if (items[k].ok) pass++; }
  345.             logk("×Ô¼ìÍê³É ͨ¹ý " + pass + "/" + plan.length);
  346.             report({ type: "SELFTEST", state: "done", pass: pass, total: plan.length, items: items });
  347.             return;
  348.         }
  349.         var p = plan[i];
  350.         var it = { name: p.name, ok: false };
  351.         try { it.msg = p.run(); it.ok = true; log("×Ô¼ì [" + (i + 1) + "/" + plan.length + "] " + p.name + " ͨ¹ý£º" + it.msg); }
  352.         catch (e) { it.msg = "" + e.message; log("×Ô¼ì [" + (i + 1) + "/" + plan.length + "] " + p.name + " ʧ°Ü£º" + it.msg); }
  353.         items.push(it);
  354.         report({ type: "SELFTEST", state: "run", item: p.name, ok: it.ok, msg: it.msg, step: i + 1, total: plan.length });
  355.         setTimeout(function () { one(i + 1); }, 400);
  356.     })(0);
  357. }

  358. // ==================== 9. Ñ­»·Ñø»ú ====================
  359. function runLoop(o) {
  360.     loopOn = true;
  361.     var act = o.act || "SWIPE";
  362.     var count = o.count || 0;
  363.     var minMs = o.min || 2000, maxMs = o.max || 2000;
  364.     var i = 0;
  365.     loopTotal = count; loopTimes = 0;
  366.     logk("Ñ­»·¿ªÊ¼ ¶¯×÷=" + act + " ´ÎÊý=" + (count > 0 ? count : "ÎÞÏÞ") + " ¼ä¸ô=" + minMs + "~" + maxMs + "ms");
  367.     report({ type: "LOOP", state: "start", act: act, count: count, times: 0 });

  368.     (function step() {
  369.         if (!loopOn) {
  370.             logk("Ñ­»·ÒÑÍ£Ö¹£¬Êµ¼ÊÖ´ÐÐ " + i + " ´Î");
  371.             report({ type: "LOOP", state: "stop", times: i });
  372.             return;
  373.         }
  374.         try {
  375.             var r = execCmd({ cmd: act, x1: o.x1, y1: o.y1, x2: o.x2, y2: o.y2, ms: o.ms, x: o.x, y: o.y, text: o.text, pkg: o.pkg });
  376.             nRun++; i++; loopTimes = i;
  377.             log("Ñ­»· µÚ" + i + "´Î/" + (count > 0 ? count : "¡Þ") + " " + act + " ³É¹¦ ºÄʱ=" + r.ms + "ms" +
  378.                 (r.data ? (" " + JSON.stringify(r.data)) : ""));
  379.             if (r.img) report({ type: "SHOT", ok: true, kb: r.kb, img: r.img });
  380.             report({ type: "LOOP", state: "run", act: act, times: i, total: count, ms: r.ms });
  381.         } catch (e) {
  382.             nErr++;
  383.             log("Ñ­»· µÚ" + (i + 1) + "´Î ʧ°Ü£º" + e.message);
  384.             report({ type: "LOOP", state: "err", err: e.message, times: i });
  385.         }
  386.         if (count > 0 && i >= count) {
  387.             loopOn = false;
  388.             logk("Ñ­»·Íê³É£¬¹² " + i + " ´Î");
  389.             report({ type: "LOOP", state: "done", times: i });
  390.             return;
  391.         }
  392.         var wait = minMs + Math.floor(Math.random() * Math.max(1, maxMs - minMs));
  393.         log("ÏÂÒ»´Î½«ÔÚ " + wait + "ms ºó£¨·¢ STOP ¿ÉÍ££©");
  394.         setTimeout(step, wait);
  395.     })();
  396. }

  397. // ==================== 10. Ö¸Áî·Ö·¢ ====================
  398. function handle(raw, from) {
  399.     nRecv++;
  400.     var o;
  401.     try { o = JSON.parse(raw); }
  402.     catch (e) { nErr++; log("ÊÕµ½·Ç JSON£¬ºöÂÔ£º" + raw.slice(0, 120)); return; }

  403.     var cmd = (o.cmd || "").toUpperCase();
  404.     log("ÊÕµ½ #" + nRecv + " " + cmd + " À´Ô´=" + from + " id=" + (o.id || "-") +
  405.         " ²ÎÊý=" + raw.slice(0, 200));

  406.     // Èý¸öÌØÊâÖ¸Áîµ¥¶À×ߣ¨Òì²½Á´Ê½Ö´ÐУ©
  407.     if (cmd === "LOOP") { runLoop(o); report({ type: "ACK", cmd: cmd, id: o.id || "", ok: true, msg: "Ñ­»·ÒÑÆô¶¯" }); return; }
  408.     if (cmd === "TASK") {
  409.         try { runTask(o.steps); report({ type: "ACK", cmd: cmd, id: o.id || "", ok: true, msg: "ÈÎÎñÒÑÆô¶¯ ¹²" + o.steps.length + "²½" }); }
  410.         catch (e) { nErr++; report({ type: "ACK", cmd: cmd, id: o.id || "", ok: false, err: e.message }); }
  411.         return;
  412.     }
  413.     if (cmd === "SELFTEST") {
  414.         runSelfTest();
  415.         report({ type: "ACK", cmd: cmd, id: o.id || "", ok: true, msg: "×Ô¼ìÒÑÆô¶¯" });
  416.         return;
  417.     }

  418.     var res = { type: "ACK", cmd: cmd, id: o.id || "" };
  419.     try {
  420.         var r = execCmd(o);
  421.         res.ok = r.ok; res.ms = r.ms;
  422.         if (r.msg) res.msg = r.msg;
  423.         if (r.data) res.data = r.data;
  424.         if (r.info) res.info = r.info;
  425.         if (r.env) res.env = r.env;
  426.         if (r.wait) res.wait = r.wait;
  427.         if (r.img) { res.kb = r.kb; res.img = r.img; }
  428.         log("Ö´ÐÐ " + cmd + " ³É¹¦ ºÄʱ=" + r.ms + "ms");
  429.     } catch (e) {
  430.         nErr++;
  431.         res.ok = false; res.err = "" + e.message;
  432.         log("Ö´ÐÐ " + cmd + " ʧ°Ü£º" + e.message);
  433.     }
  434.     report(res);
  435. }

  436. // ==================== 11. Á¬½Ó ====================
  437. function connect() {
  438.     var cid = "aiwrok_" + ROOM + "_" + DEV_ID + "_" + Math.floor(Math.random() * 10000);
  439.     logk("[3/6] Á¬½Ó " + BROKER + " clientId=" + cid);
  440.     client = new MqttClient(BROKER, cid, new MemoryPersistence());

  441.     var opt = new MqttConnectOptions();
  442.     opt.setCleanSession(true);
  443.     opt.setKeepAliveInterval(45);
  444.     opt.setConnectionTimeout(15);
  445.     opt.setAutomaticReconnect(true);

  446.     client.setCallback(new MqttCallback({
  447.         connectionLost: function (c) {
  448.             IN_CALLBACK = true;
  449.             try { connected = false; if (LOGQ.length < 800) LOGQ.push("µôÏߣº" + c + "£¨¿´ÃŹ·½«×Ô¶¯ÖØÁ¬£©"); }
  450.             finally { IN_CALLBACK = false; }
  451.         },
  452.         messageArrived: function (topic, msg) {
  453.             IN_CALLBACK = true;                       // ±¾Ï߳̽ûÖ¹ printl / ½ûÖ¹×öÖØ»î
  454.             try {
  455.                 var text = "" + new java.lang.String(msg.getPayload(), "UTF-8");
  456.                 var from = ("" + topic === T.cmdAll) ? "¹ã²¥" : "¶¨Ïò";
  457.                 if (CMDQ.length < 200) CMDQ.push({ raw: text, from: from });
  458.                 if (LOGQ.length < 800) LOGQ.push("ÊÕµ½Ô­Ê¼°ü Ö÷Ìâ=" + topic + " ×Ö½Ú=" + text.length);
  459.             } catch (e) {
  460.                 if (LOGQ.length < 800) LOGQ.push("ÊÕ°üÒì³££º" + e.message);
  461.             } finally { IN_CALLBACK = false; }
  462.         },
  463.         deliveryComplete: function (t) { }
  464.     }));

  465.     client.connect(opt);
  466.     connected = true;
  467.     client.subscribe(T.cmdMine, 1);
  468.     client.subscribe(T.cmdAll, 1);
  469.     logk("[4/6] ÒѶ©ÔÄ " + T.cmdMine);
  470.     logk("[4/6] ÒѶ©ÔÄ " + T.cmdAll);
  471.     report({ type: "ONLINE" }, true);
  472.     flushLog();
  473. }

  474. // ==================== 12. Æô¶¯£º´òÓ¡ÍêÕû»·¾³ ====================
  475. logk("========== Ö´ÐÐÆ÷ " + VER + " Æô¶¯ ==========");
  476. log("Éè±¸Æ·ÅÆ = " + INFO.brand);
  477. log("É豸ÐͺŠ= " + INFO.model);
  478. log("IMEI     = " + (INFO.imei || "(ÎÞȨÏÞ)"));
  479. log("°²×¿°æ±¾ = " + INFO.android + "  SDK=" + INFO.sdk);
  480. log("ÆÁÄ»     = " + INFO.w + "x" + INFO.h);
  481. log("·¿¼äºÅ   = " + ROOM + "   »úºÅ = " + DEV_ID);
  482. log("Broker   = " + BROKER);
  483. log("¶©ÔÄÖ÷Ìâ = " + T.cmdMine + " , " + T.cmdAll);
  484. log("»Ø´«Ö÷Ìâ = " + T.ret);
  485. log("½ØÍ¼²ÎÊý = ×î´ó¿í " + SHOT_MAXW + "px, JPEGÖÊÁ¿ " + SHOT_QUAL);
  486. log("Ö§³ÖÖ¸Áî = PING INFO STATUS SHOT CLICK SWIPE TEXT CLIP FIND APP HOME BACK WAIT LOOP TASK SELFTEST STOP RAND");
  487. logk("[5/6] »·¾³¶ÁÈ¡Íê³É");

  488. try { connect(); }
  489. catch (e) { connected = false; log("[6/6] Ê×´ÎÁ¬½Óʧ°Ü£º" + e.message + "£¬¿´ÃŹ·³ÖÐøÖØÊÔ"); }

  490. // ---------- Ö÷Ï߳̿´ÃŹ·£ºÖ´ÐжÓÁÐ + Ë¢ÈÕÖ¾ + ÖØÁ¬Öض©ÔÄ ----------
  491. var tickSec = 0, retryAt = 0;
  492. setInterval(function () {
  493.     tickSec++;
  494.     // 1) Ö÷Ïß³ÌÖ´ÐÐÅŶÓÖ¸ÁÿÂÖ×î¶à 5 Ìõ£©
  495.     var k = 0;
  496.     while (CMDQ.length > 0 && k < 5) {
  497.         var job = CMDQ.shift();
  498.         try { handle(job.raw, job.from); }
  499.         catch (e) { nErr++; log("Ö¸ÁîÖ´ÐÐÒì³££º" + e.message); }
  500.         k++;
  501.     }
  502.     flushLog();                                        // 2) Ë¢»Øµ÷ÈÕÖ¾
  503.     // 3) Á¬½Ó״̬ͬ²½
  504.     try {
  505.         var real = client ? client.isConnected() : false;
  506.         if (real && !connected) {
  507.             connected = true;
  508.             client.subscribe(T.cmdMine, 1);
  509.             client.subscribe(T.cmdAll, 1);
  510.             logk("Òѻָ´Á¬½Ó²¢ÖØÐ¶©ÔÄ£¨cleanSession ϱØÐëÖØ¶©ÔÄ£©");
  511.             report({ type: "ONLINE" }, true);
  512.         }
  513.         if (!real && client && (tickSec - retryAt) >= 8) {
  514.             connected = false;
  515.             retryAt = tickSec;
  516.             log("µÚ " + tickSec + " Ã룺δÁ¬½Ó£¬Ö÷¶¯´¥·¢ÖØÁ¬¡­");
  517.             try { client.reconnect(); }
  518.             catch (e) {
  519.                 log("reconnect ʧ°Ü£º" + e.message + "£¬Öؽ¨Á¬½Ó");
  520.                 try { connect(); } catch (e2) { log("ÖØ½¨Ê§°Ü£º" + e2.message); }
  521.             }
  522.         }
  523.     } catch (e) { log("¿´ÃŹ·Òì³££º" + e.message); }
  524. }, 1000);

  525. // ---------- ÐÄÌø ----------
  526. var beat = 0;
  527. setInterval(function () {
  528.     beat++;
  529.     if (connected) {
  530.         report({ type: "HEART", up: beat * 20, recv: nRecv, sent: nSent, run: nRun,
  531.                  err: nErr, loop: loopOn, task: taskOn, rand: randOn });
  532.     } else {
  533.         log("ÐÄÌøÌø¹ý£¨µ±Ç°ÀëÏߣ¬¿´ÃŹ·ÖØÁ¬ÖУ©");
  534.     }
  535. }, 20000);

  536. logk("[6/6] ÒѽøÈë´ýÃü£ºÃ¿ 1 ÃëȡָÁî/²éÁ¬½Ó£¬Ã¿ 20 ÃëÐÄÌø¡£Í£Ö¹Çëµã IDE Í£Ö¹°´Å¥");
¸´ÖÆ´úÂë


»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

±¾°æ»ý·Ö¹æÔò

¹Ø±Õ

QQ|»ÓªÏúÈí¼þ×ÛºÏÌÖÂÛ|»ÓªÏúÈí¼þÓÐÎʱشð|»ÓªÏúÈí¼þ½Ì³Ì×¨Çø|»ÓªÏúÈí¼þPOST½Å±¾·ÖÏí|»ÓªÏúÈí¼þÆÕͨ½Å±¾·ÖÏí|»ÓªÏúÈí¼þÈí¼þ×ÊѶ|»ÓªÏúÈí¼þ¾«Æ·Èí¼þ|»ÓªÏúÈí¼þ¸üй«¸æ|ÓªÏúÈí¼þ|B2BÈí¼þ|B2BÍøÂçÈí¼þ ( ¾©ICP±¸09078825ºÅ )±¾ÍøÕ¾¿ª·¢µÄÓªÏúÈí¼þÊÇÒ»¿îеÄÍøÂçÓªÏúÈí¼þ£¬Õâ¿îÓªÏú¿ÉÒÔÈ¥ÍøÕ¾Èí¼þ£¬²©¿ÍÈí¼þ£¬B2BÈí¼þ£¬·ÖÀàÐÅÏ¢Íø·¢Ìù£¬¿ÉÒÔÇÀɳ·¢£¬¿ÉÒÔµ½°Ù¶ÈÎÄ¿âÉÏ´«WORDÎĵµ£¬¿ÉÒÔµ½Ò»Ð©ÊÇÏà²áÍøÕ¾×Ô¶¯ÉÏ´«Í¼Æ¬£¬Õâ¸ö×Ô¶¯·¢ÌûÈí¼þ×Ô´øÔÆÖ©Ö룬¼Ó¿ìÊÕ¼£¬ÓÐ6ÖÖ¶Ô½Ó´òÂë½Ó¿Ú£¬·½±ã£¬Ð§Âʸߣ¬Ëٶȿ죬¶øÇÒ¶ÔÍ϶¯µÄÑéÖ¤ÂëÈ«ÍøµÚÒ»¼Ò¶À¼ÒÖ§³Ö£¬È«²¿Ô­´´¼¼Êõ£¬¶À¼ÒÑз¢£¬Õý°æÔ­´´´ø°æÈ¨Èí¼þ¡£Ñ¡ÔñÍòÄÜÓªÏúÈí¼þ£¬¾ÍÑ¡ÔñÁËÒ»ÖÖ׬ǮµÄЧÂÊ£¬´ÓûÓб»³¬Ô½¹ý£¬Ò»Ö±ÔÚŬÁ¦Ñз¢Ð¼¼Êõ¡£·Å·ÉÃÎÏ룬½â·ÅË«ÊÖ£¬À´µã´´Ò⣬³É¾ÍÄãµÄÃÎÏ룬¾ÍÔÚÍòÄÜÓªÏúÈí¼þ¿ªÊ¼

map2

GMT+8, 2026-9-3 07:31 , Processed in 0.114314 second(s), 33 queries .

¿ìËٻظ´ ·µ»Ø¶¥²¿ ·µ»ØÁбí