B2BÍøÂçÈí¼þ

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

MQTTЭÒéʾÀýAIWROK°æ

[¸´ÖÆÁ´½Ó]

1166

Ö÷Ìâ

1171

Ìû×Ó

7941

»ý·Ö

abc

Rank: 9Rank: 9Rank: 9

»ý·Ö
7941
Ìø×ªµ½Ö¸¶¨Â¥²ã
Â¥Ö÷
MQTTЭÒéʾÀýAIWROK°æ
MQTTЭÒéʾÀýAIWROK°æ B2BÍøÂçÈí¼þ

MQTTЭÒéʾÀýAIWROK°æ B2BÍøÂçÈí¼þ

MQTTЭÒéʾÀýAIWROK°æ B2BÍøÂçÈí¼þ

MQTTЭÒéʾÀýAIWROK°æ B2BÍøÂçÈí¼þ

  1. /**
  2. * MQTT ЭÒéʾÀý - AIWROK °æ
  3. *
  4. * ʹÓà Eclipse Paho Java ¿Í»§¶ËʵÏÖ MQTT v3.1.1 Á¬½Ó
  5. *
  6. * v5 ˵Ã÷£ºdex Ϊ¹Ù·½ Paho 1.2.5 Ô´ÂëÐÞ²¹°æ£¨2026-08-29 ÖØ½¨£©£º
  7. *   1. LoggerFactory ×ÊÔ´°ü²éÕÒ¼Ó±£»¤£¬Ä¬ÈÏʹÓà MockLogger£¨ÎÞ²Ù×÷ÈÕÖ¾£©
  8. *      ¡ú ÐÞ¸´ dex »·¾³Ï ResourceBundle.getBundle ±ØÅ× MissingResourceException
  9. *   2. NetworkModuleService ¼ÓÄÚÖÃЭÒ鹤³§¶µµ×£¨tcp/ssl/ws/wss£©
  10. *      ¡ú ÐÞ¸´ dex ÎÞ META-INF/services µ¼ÖÂ "no NetworkModule installed for scheme tcp"
  11. *   3. ½Å±¾²»ÔÙÐèÒªÈκÎÔËÐÐʱ·´Éä²¹¶¡
  12. * Ö§³Ö£º·¢²¼/¶©ÔÄģʽ¡¢QoS 0/1/2¡¢×Ô¶¯ÖØÁ¬¡¢ÒÅÖöÏûÏ¢¡¢ÐÄÌø±£»î
  13. *
  14. * MQTT vs WebSocket Çø±ð£º
  15. *   MQTT ÊÇÇáÁ¿¼¶·¢²¼/¶©ÔÄÏûϢЭÒ飬ÊÊºÏ IoT/ÒÆ¶¯¶Ë
  16. *   ±È WebSocket ¸üÊ¡µç¡¢¸üÊ¡Á÷Á¿£¬Ö§³Ö QoS ÏûÏ¢ÖÊÁ¿±£Ö¤
  17. *   Ö§³ÖÖ÷Ìâ(Topic)¶©ÔÄ£¬ÏûϢ·ÓɸüÁé»î
  18. *
  19. * ÒÀÀµ¼ÓÔØ£¨×Ô¶¯£¬ÎÞÐèÊÖ¶¯²Ù×÷£©£º
  20. *   dex Îļþ·ÅÔÚ H5HTML/²å¼þ/ Ŀ¼£¬AIWROK µÄ loadDex ×Ô¶¯¼ÓÔØ
  21. *   loadDex Ö»´Ó"²å¼þ"Ŀ¼¼ÓÔØ£¬ÇÒÐèÒª .dex ¸ñʽ£¨²»ÊÇ .jar£©
  22. *
  23. *   dex ÎļþÒÑËæ¹¤³Ì´ò°üÔÚ£ºH5HTML/²å¼þ/paho-mqtt.dex
  24. *   Èç¹û²å¼þĿ¼ûÓÐ dex£¬×Ô¶¯´Ó´úÂëĿ¼µÄ paho-mqtt-dex-b64.js »¹Ô­
  25. *
  26. * ʹÓ÷½·¨£º
  27. *   1. ÐÞ¸Ä CFG ÖÐµÄ broker µØÖ·¡¢¶Ë¿Ú¡¢Óû§ÃûÃÜÂë
  28. *   2. AIWROK ÖÐÖ±½ÓÔËÐб¾½Å±¾
  29. *   3. ÈÕÖ¾´°¿Ú²é¿´Á¬½Ó״̬ºÍÊÕ·¢ÏûÏ¢
  30. */

  31. // ========== ¼ÓÔØ Paho MQTT Java ¿â ==========
  32. // AIWROK loadDex Ö»´Ó H5HTML/²å¼þ/ Ŀ¼¼ÓÔØ .dex Îļþ
  33. // AIWROK IDE ²»»áͬ²½²å¼þĿ¼µÄ¶þ½øÖÆÎļþµ½ÊÖ»ú£¬
  34. // ½Å±¾ÔËÐÐʱ´ÓÄÚǶµÄ base64 Êý¾Ý×Ô¶¯»¹Ô­ dex Îļþµ½²å¼þĿ¼
  35. var loaded = false;

  36. // ÊÖ»ú¶Ë·¾¶
  37. var sdcardPath = "/sdcard";
  38. var projectRoot = sdcardPath + "/auto/H5HTML";
  39. var pluginDir = projectRoot + "/²å¼þ";
  40. var codeDir = projectRoot + "/´úÂë";
  41. var dexFileName = "paho-mqtt.dex";
  42. var dexTargetPath = pluginDir + "/" + dexFileName;

  43. // dex °æ±¾Åж¨£ºÒÔÄÚǶ base64 ½âÂëºóµÄ³¤¶ÈΪΨһ»ù×¼
  44. // £¨ÕâÑùÒÔºóÖØÐ´ò°ü dex ²»±Ø¸ÄÈκγ£Á¿£¬½Å±¾×Ô¼º»á±È¶Ô²¢¸²¸Ç¾É°æ£©
  45. function fileSize(path) {
  46.     try {
  47.         var f = new java.io.File(path);
  48.         return f.exists() ? Number(f.length()) : -1;
  49.     } catch (e) { return -1; }
  50. }

  51. // ÏÈÈ¡ÄÚǶÊý¾Ý£ºrequire ʧ°ÜÖ»¼ÇÈÕÖ¾£¬²»Èýű¾±À
  52. var dexBytes = null;
  53. try {
  54.     try { require("paho-mqtt-dex-b64.js"); } catch (reqErr) {
  55.         printl("[WARN] require paho-mqtt-dex-b64.js ʧ°Ü: " + reqErr.message);
  56.     }
  57.     if (typeof PAHO_MQTT_DEX_B64 !== "undefined" && PAHO_MQTT_DEX_B64) {
  58.         dexBytes = java.util.Base64.getDecoder().decode(PAHO_MQTT_DEX_B64);
  59.         printl("[INFO] ÄÚǶ dex Êý¾Ý: " + dexBytes.length + " bytes");
  60.     } else {
  61.         printl("[WARN] δȡµ½ÄÚǶ base64 Êý¾Ý£¨PAHO_MQTT_DEX_B64 Ϊ¿Õ£©");
  62.     }
  63. } catch (e) {
  64.     printl("[WARN] ÄÚǶ dex ½âÂëʧ°Ü: " + e.message);
  65.     dexBytes = null;
  66. }

  67. var expectedSize = dexBytes ? Number(dexBytes.length) : -1;
  68. var curSize = fileSize(dexTargetPath);
  69. var dexWasThere = curSize > 0;
  70. // ÓÐÄÚǶÊý¾Ý¾Í°´×Ö½ÚÊýÅа汾£»Ã»ÓоÍ"ÓÐ dex ÏÈÓÃ×Å"
  71. var verOk = (expectedSize > 0) ? (curSize === expectedSize) : dexWasThere;

  72. printl("[INFO] ²å¼þĿ¼ dex: " + (dexWasThere ? ("ÒÑ´æÔÚ " + curSize + " bytes") : "²»´æÔÚ") +
  73.     "£¬" + (verOk ? "°æ±¾Ð£Ñéͨ¹ý" : ("Ðè֨װ£¨ÆÚÍû " + (expectedSize > 0 ? expectedSize : "δ֪") + " bytes£©")));

  74. // µÚÒ»²½£ºÈ·±£²å¼þĿ¼´æÔÚ
  75. try { file.mkdir(pluginDir); } catch (e) {}

  76. // µÚ¶þ²½£º°æ±¾²»¶Ô¾ÍÓÃÄÚǶÊý¾Ý¸²¸Ç»¹Ô­
  77. var installed = false;
  78. if (!verOk && dexBytes) {
  79.     try {
  80.         var fos = new java.io.FileOutputStream(dexTargetPath);
  81.         fos.write(dexBytes);
  82.         fos.close();
  83.         printl("[INFO] ÒÑ»¹Ô­ " + dexFileName + " µ½²å¼þĿ¼");
  84.         installed = true;
  85.     } catch (e) {
  86.         printl("[WARN] дÈë dex ʧ°Ü: " + e.message);
  87.     }
  88. }

  89. // ×îÖÕÅж¨ÄÜ·ñ¼ÓÔØ£º»¹Ô­³É¹¦£¬»òÊÖ»úÉϱ¾À´¾ÍÓÐ dex£¨ÍË»ØÊ¹ÓÃÏÖÓÐÎļþ£©
  90. var dexExists = installed || dexWasThere;
  91. if (!installed && !verOk && dexWasThere) {
  92.     printl("[WARN] ÄÚǶ»¹Ô­Î´Íê³É£¬¸ÄÓÃÊÖ»úÉÏÏÖÓÐµÄ dex ¼ÌÐø¼ÓÔØ");
  93. }

  94. // µÚÈý²½£ºÓà loadDex ¼ÓÔØ
  95. if (dexExists) {
  96.     try {
  97.         rhino.loadDex(dexFileName);
  98.         printl("[INFO] Paho MQTT ¼ÓÔØ³É¹¦ (loadDex: " + dexFileName + ")");
  99.         loaded = true;
  100.     } catch (e) {
  101.         printl("[WARN] loadDex ʧ°Ü: " + e.message + "£¬³¢ÊÔÍêÕû·¾¶...");
  102.         try {
  103.             rhino.loadDex(dexTargetPath);
  104.             printl("[INFO] Paho MQTT ¼ÓÔØ³É¹¦ (loadDex ÍêÕû·¾¶)");
  105.             loaded = true;
  106.         } catch (e2) {
  107.             printl("[WARN] loadDex ÍêÕû·¾¶Ò²Ê§°Ü: " + e2.message);
  108.         }
  109.     }
  110. } else {
  111.     try {
  112.         rhino.loadDex(codeDir + "/paho-mqtt.dex");
  113.         printl("[INFO] Paho MQTT ¼ÓÔØ³É¹¦ (loadDex: ´úÂëĿ¼)");
  114.         loaded = true;
  115.     } catch (e) {
  116.         printl("[WARN] loadDex(´úÂëĿ¼) ʧ°Ü: " + e.message);
  117.     }
  118. }

  119. if (!loaded) {
  120.     printl("[WARN] ×Ô¶¯¼ÓÔØÊ§°Ü£¬³¢ÊÔÖ±½Ó importClass...");
  121. }

  122. // ========== µ¼Èë Paho MQTT Java Àà ==========
  123. // ÉèÖÃÓ¢ÎÄ locale£¬±ÜÃâ Paho ²éÕÒÖÐÎÄ×ÊÔ´°üʧ°Ü
  124. try {
  125.     java.util.Locale.setDefault(java.util.Locale.ENGLISH);
  126. } catch (e) {}

  127. try {
  128.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttClient);
  129.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttConnectOptions);
  130.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttCallback);
  131.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttMessage);
  132.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttException);
  133.     importClass(Packages.org.eclipse.paho.client.mqttv3.persist.MemoryPersistence);
  134.     importClass(Packages.org.eclipse.paho.client.mqttv3.IMqttDeliveryToken);
  135.     importClass(Packages.org.eclipse.paho.client.mqttv3.MqttTopic);
  136.     printl("[INFO] Paho MQTT ÀർÈë³É¹¦");
  137. } catch (e) {
  138.     printl("[FATAL] Paho MQTT ÀർÈëʧ°Ü: " + e.message);
  139.     printl("[FATAL] ÇëÈ·±£ paho-mqtt.dex ÔÚ H5HTML/²å¼þ/ Ŀ¼");
  140.     printl("[FATAL] dex ÎļþÒÑËæ¹¤³Ì´ò°üÔÚ: H5HTML/²å¼þ/paho-mqtt.dex");
  141.     printl("[FATAL] ÈçÐèÊÖ¶¯ÏÂÔØ jar ²¢×ª»»: https://repo1.maven.org/maven2/org/eclipse/paho/org.eclipse.paho.client.mqttv3/1.2.5/org.eclipse.paho.client.mqttv3-1.2.5.jar");
  142.     printl("[FATAL] ת»»ÃüÁî: java -cp dx.jar com.android.dx.command.Main --dex --output=paho-mqtt.dex paho-mqtt.jar");
  143.     exit();
  144. }

  145. // ========== ÅäÖÃ ==========
  146. var CFG = {
  147.     // MQTT Broker µØÖ·£¨TCP ·½Ê½£©
  148.     brokerUrl: "tcp://broker.emqx.io:1883",

  149.     // ¿Í»§¶Ë ID£¨Áô¿Õ×Ô¶¯Éú³É£©
  150.     clientId: "",

  151.     // Óû§ÃûÃÜÂë
  152.     username: "",
  153.     password: "",

  154.     // ÐÄÌø¼ä¸ô£¨Ã룩
  155.     keepAliveSec: 30,

  156.     // Á¬½Ó³¬Ê±£¨Ã룩
  157.     connectTimeoutSec: 15,

  158.     // »á»°Çå³ý±êÖ¾
  159.     cleanSession: true,

  160.     // ÒÅÖöÏûÏ¢£¨LWT£©
  161.     willTopic: "",
  162.     willMessage: "",
  163.     willQos: 0,
  164.     willRetained: false,

  165.     // ×Ô¶¯ÖØÁ¬
  166.     autoReconnect: true,
  167.     reconnectDelayMs: 3000,
  168.     maxReconnectDelayMs: 30000,

  169.     // ĬÈÏ QoS
  170.     defaultQos: 1,

  171.     // ¶©ÔÄÖ÷ÌâÁбí
  172.     subscribeTopics: [
  173.         { topic: "aiwrok/cmd/+", qos: 1 },
  174.         { topic: "aiwrok/broadcast", qos: 0 },
  175.         { topic: "aiwrok/status/request", qos: 1 }
  176.     ],

  177.     // ·¢²¼Ö÷Ìâǰ׺
  178.     pubTopicPrefix: "aiwrok",

  179.     // µ÷ÊÔÈÕÖ¾
  180.     debug: true,

  181.     // ½Å±¾ÔËÐÐʱ³¤£¨ºÁÃ룩£¬0=ÎÞÏÞ
  182.     runDuration: 0
  183. };

  184. // ========== È«¾Ö״̬ ==========
  185. var G = {
  186.     mqttClient: null,
  187.     connected: false,
  188.     running: true,
  189.     startTime: 0,
  190.     msgSentCount: 0,
  191.     msgRecvCount: 0,
  192.     reconnectCount: 0
  193. };

  194. // ========== ʱ¼ä¹¤¾ß ==========
  195. function nowMs() {
  196.     return (new Date()).getTime();
  197. }
  198. function nowSec() {
  199.     return Math.floor(nowMs() / 1000);
  200. }

  201. // ========== É豸ÐÅÏ¢ ==========
  202. function getDeviceInfo() {
  203.     var info = {
  204.         imei: "",
  205.         brand: "",
  206.         model: "",
  207.         android: "",
  208.         screen: ""
  209.     };
  210.     try { info.imei = device.getIMEI() || ""; } catch (e) {}
  211.     try { info.brand = device.getBrand() || ""; } catch (e) {}
  212.     try { info.model = device.getModel() || ""; } catch (e) {}
  213.     try { info.android = java.lang.System.getProperty("os.version") + ""; } catch (e) {}
  214.     try { info.screen = screen.getScreenWidth() + "x" + screen.getScreenHeight(); } catch (e) {}
  215.     return info;
  216. }

  217. // ========== Éú³É¿Í»§¶Ë ID ==========
  218. function generateClientId() {
  219.     var info = getDeviceInfo();
  220.     var ts = nowMs();
  221.     var rand = Math.floor(Math.random() * 10000);
  222.     return "aiwrok_" + (info.imei || info.model || "dev") + "_" + ts + "_" + rand;
  223. }

  224. // ========== »ñÈ¡·¢²¼Ö÷Ìâ ==========
  225. function getPubTopic(suffix) {
  226.     return CFG.pubTopicPrefix + "/" + suffix;
  227. }

  228. // ========== ·¢²¼ÏûÏ¢ ==========
  229. function publish(topic, payload, qos) {
  230.     if (!G.connected || !G.mqttClient) {
  231.         printl("[WARN] δÁ¬½Ó£¬ÎÞ·¨·¢²¼: " + topic);
  232.         return false;
  233.     }
  234.     if (qos == null) qos = CFG.defaultQos;

  235.     try {
  236.         var content;
  237.         if (typeof payload === "string") {
  238.             content = payload;
  239.         } else {
  240.             content = JSON.stringify(payload);
  241.         }

  242.         var msg = new MqttMessage();
  243.         msg.setPayload(new java.lang.String(content).getBytes("UTF-8"));
  244.         msg.setQos(qos);

  245.         G.mqttClient.publish(topic, msg);
  246.         G.msgSentCount++;

  247.         printl("[PUB] " + topic + " qos=" + qos + " len=" + content.length);
  248.         return true;
  249.     } catch (e) {
  250.         printl("[ERROR] ·¢²¼Òì³£: " + e.message);
  251.         return false;
  252.     }
  253. }

  254. // ========== ´¦ÀíÊÕµ½µÄÏûÏ¢ ==========
  255. function handleMessage(topic, message) {
  256.     G.msgRecvCount++;

  257.     var payload = "";
  258.     try {
  259.         payload = "" + new java.lang.String(message.getPayload(), "UTF-8");
  260.     } catch (e) {
  261.         try { payload = String(message); } catch (e2) { payload = "" + message; }
  262.     }

  263.     printl("[SUB] " + topic + " len=" + payload.length + " | " + payload.slice(0, 200));

  264.     var obj = null;
  265.     try {
  266.         obj = JSON.parse(payload);
  267.     } catch (e) {
  268.         printl("[DEBUG] ·Ç JSON ÏûÏ¢: " + payload.slice(0, 100));
  269.         return;
  270.     }

  271.     if (topic.indexOf("cmd/") >= 0) {
  272.         handleCmdMessage(topic, obj);
  273.     } else if (topic.indexOf("broadcast") >= 0) {
  274.         printl("[INFO] ¹ã²¥ÏûÏ¢: " + (obj.msg || payload.slice(0, 100)));
  275.     } else if (topic.indexOf("status/request") >= 0) {
  276.         handleStatusRequest(topic, obj);
  277.     } else {
  278.         printl("[DEBUG] δ´¦ÀíµÄÖ÷Ìâ: " + topic);
  279.     }
  280. }

  281. // ========== ´¦ÀíÃüÁîÏûÏ¢ ==========
  282. function handleCmdMessage(topic, obj) {
  283.     var cmd = obj.cmd || obj.type || "";
  284.     printl("[INFO] ÊÕµ½ÃüÁî: " + cmd);

  285.     if (cmd === "SCREENSHOT") {
  286.         try {
  287.             var bitmap = screen.screenShotFull();
  288.             if (!bitmap) {
  289.                 publish(getPubTopic("resp/screenshot"), { ok: false, msg: "½ØÍ¼·µ»Ø¿Õ" });
  290.                 return;
  291.             }
  292.             var base64 = "" + bitmap.toBase64();
  293.             try { bitmap.recycle(); } catch (e) {}
  294.             publish(getPubTopic("resp/screenshot"), {
  295.                 ok: true,
  296.                 cmdId: obj.cmdId,
  297.                 base64: base64,
  298.                 length: base64.length
  299.             });
  300.         } catch (e) {
  301.             publish(getPubTopic("resp/screenshot"), { ok: false, msg: e.message });
  302.         }
  303.     } else if (cmd === "CLICK") {
  304.         try {
  305.             var x = parseInt(obj.data.x, 10);
  306.             var y = parseInt(obj.data.y, 10);
  307.             if (isNaN(x) || isNaN(y)) {
  308.                 publish(getPubTopic("resp/click"), { ok: false, msg: "×ø±êÎÞЧ" });
  309.                 return;
  310.             }
  311.             if (typeof action !== "undefined") {
  312.                 action.click(x, y);
  313.             } else if (typeof hid !== "undefined") {
  314.                 hid.click(x, y);
  315.             }
  316.             publish(getPubTopic("resp/click"), { ok: true, cmdId: obj.cmdId, x: x, y: y });
  317.         } catch (e) {
  318.             publish(getPubTopic("resp/click"), { ok: false, msg: e.message });
  319.         }
  320.     } else if (cmd === "STATUS") {
  321.         handleStatusRequest(topic, obj);
  322.     } else if (cmd === "HOME") {
  323.         try { if (typeof hid !== "undefined") hid.home(); } catch (e) {}
  324.     } else if (cmd === "BACK") {
  325.         try { if (typeof hid !== "undefined") hid.back(); } catch (e) {}
  326.     } else {
  327.         printl("[DEBUG] δ֪ÃüÁî: " + cmd);
  328.     }
  329. }

  330. // ========== ´¦Àí״̬²éѯ ==========
  331. function handleStatusRequest(topic, obj) {
  332.     var info = getDeviceInfo();
  333.     info.ok = true;
  334.     info.cmdId = obj.cmdId;
  335.     info.runtimeSec = nowSec() - G.startTime;
  336.     info.msgSentCount = G.msgSentCount;
  337.     info.msgRecvCount = G.msgRecvCount;
  338.     info.reconnectCount = G.reconnectCount;
  339.     publish(getPubTopic("resp/status"), info);
  340. }

  341. // ========== ¶©ÔÄÖ÷Ìâ ==========
  342. function subscribeTopics() {
  343.     if (!G.connected || !G.mqttClient) return;

  344.     for (var i = 0; i < CFG.subscribeTopics.length; i++) {
  345.         var item = CFG.subscribeTopics[i];
  346.         try {
  347.             G.mqttClient.subscribe(item.topic, item.qos);
  348.             printl("[INFO] ÒѶ©ÔÄ: " + item.topic + " qos=" + item.qos);
  349.         } catch (e) {
  350.             printl("[ERROR] ¶©ÔÄʧ°Ü " + item.topic + ": " + e.message);
  351.         }
  352.     }
  353. }

  354. // ========== MQTT »Øµ÷ʵÏÖ ==========
  355. function createMqttCallback() {
  356.     return new MqttCallback({
  357.         connectionLost: function (cause) {
  358.             G.connected = false;
  359.             var msg = "unknown";
  360.             try { msg = String(cause.getMessage()); } catch (e) {}
  361.             printl("[WARN] Á¬½Ó¶Ï¿ª: " + msg);
  362.         },

  363.         messageArrived: function (topic, message) {
  364.             try {
  365.                 handleMessage("" + topic, message);
  366.             } catch (e) {
  367.                 printl("[ERROR] ÏûÏ¢´¦ÀíÒì³£: " + e.message);
  368.             }
  369.         },

  370.         deliveryComplete: function (token) {
  371.             printl("[DEBUG] ÏûϢͶµÝÍê³É");
  372.         }
  373.     });
  374. }

  375. // ========== Á¬½Óʧ°ÜͳһÕï¶Ï´òÓ¡£¨·Ö½×¶Î¶¨Î» + JS/Java Ë«¶ÑÕ»£© ==========
  376. function logConnErr(stage, e) {
  377.     var errMsg = "" + e;
  378.     try {
  379.         if (e instanceof MqttException) {
  380.             errMsg = "MQTT Error " + e.getReasonCode() + ": " + e.getMessage();
  381.         }
  382.     } catch (e2) {}
  383.     printl("[ERROR] " + stage + " ʧ°Ü: " + errMsg);
  384.     // Rhino µÄ e.stack Ö¸Ïò½Å±¾ÐкÅ
  385.     try { printl("[ERROR] " + stage + " JS¶ÑÕ»: " + (e.stack || "(ÎÞ)")); } catch (e3) {}
  386.     // e.javaException Êǵײã Java Throwable£¨Rhino °ü×°¶ÔÏó±¾Éí²»ÄÜÖ±½Ó printStackTrace£©
  387.     try {
  388.         var je = e.javaException;
  389.         if (je) {
  390.             var sw = new java.io.StringWriter();
  391.             var pw = new java.io.PrintWriter(sw);
  392.             je.printStackTrace(pw);
  393.             pw.flush();
  394.             printl("[ERROR] " + stage + " Java¶ÑÕ»: " + sw.toString());
  395.         }
  396.     } catch (e4) {}
  397. }

  398. // ========== ½¨Á¢Á¬½Ó ==========
  399. // ²ð³É 3 ¸ö½×¶Î·Ö±ð try/catch£ºÄÄÒ»½×¶ÎÅ×´íһĿÁËÈ»
  400. function connect() {
  401.     printl("[INFO] ÕýÔÚÁ¬½Ó MQTT Broker: " + CFG.brokerUrl);

  402.     if (!CFG.clientId) {
  403.         CFG.clientId = generateClientId();
  404.     }
  405.     printl("[INFO] ¿Í»§¶Ë ID: " + CFG.clientId);

  406.     // ---- ½×¶Î1£º´´½¨ MqttClient£¨¹¹ÔìÆ÷ÀïÓÐ log.fine£¬ÊÇ NPE ¸ß·¢µã£© ----
  407.     try {
  408.         var persistence = new MemoryPersistence();
  409.         var brokerUri = CFG.brokerUrl;
  410.         if (brokerUri.indexOf("://") < 0) {
  411.             brokerUri = "tcp://" + brokerUri;
  412.         }
  413.         G.mqttClient = new MqttClient(brokerUri, CFG.clientId, persistence);
  414.         printl("[INFO] [½×¶Î1/3] MqttClient ´´½¨³É¹¦");
  415.     } catch (e1) {
  416.         G.connected = false;
  417.         logConnErr("½×¶Î1 ´´½¨MqttClient", e1);
  418.         return false;
  419.     }

  420.     // ---- ½×¶Î2£ºÅäÖÃÁ¬½ÓÑ¡Ïî ----
  421.     var options = null;
  422.     try {
  423.         options = new MqttConnectOptions();
  424.         options.setKeepAliveInterval(CFG.keepAliveSec);
  425.         options.setConnectionTimeout(CFG.connectTimeoutSec);
  426.         options.setCleanSession(CFG.cleanSession);

  427.         if (CFG.autoReconnect) {
  428.             options.setAutomaticReconnect(true);
  429.             try {
  430.                 options.setMaxReconnectDelay(CFG.maxReconnectDelayMs);
  431.             } catch (e) {}
  432.         }
  433.         if (CFG.username) {
  434.             options.setUserName(CFG.username);
  435.         }
  436.         if (CFG.password) {
  437.             options.setPassword(CFG.password.toCharArray());
  438.         }
  439.         if (CFG.willTopic && CFG.willMessage) {
  440.             options.setWill(
  441.                 CFG.willTopic,
  442.                 new java.lang.String(CFG.willMessage).getBytes("UTF-8"),
  443.                 CFG.willQos,
  444.                 CFG.willRetained
  445.             );
  446.         }
  447.         printl("[INFO] [½×¶Î2/3] Á¬½ÓÑ¡ÏîÅäÖÃÍê³É");
  448.     } catch (e2) {
  449.         G.connected = false;
  450.         logConnErr("½×¶Î2 ÅäÖÃÑ¡Ïî", e2);
  451.         return false;
  452.     }

  453.     // ---- ½×¶Î3£ºÉèÖûص÷²¢Ö´ÐÐÁ¬½Ó£¨ÍøÂçÎÕÊÖÔÚÕâÀ ----
  454.     try {
  455.         G.mqttClient.setCallback(createMqttCallback());
  456.         G.mqttClient.connect(options);

  457.         G.connected = true;
  458.         G.reconnectCount = 0;
  459.         printl("[INFO] [½×¶Î3/3] MQTT Á¬½Ó³É¹¦ ¡ª ÎÕÊÖÍê³É");

  460.         try { subscribeTopics(); } catch (eS) { printl("[WARN] ¶©ÔÄÒì³£: " + eS.message); }
  461.         try {
  462.             publish(getPubTopic("online"), {
  463.                 clientId: CFG.clientId,
  464.                 device: getDeviceInfo(),
  465.                 ts: nowSec()
  466.             }, 0);
  467.         } catch (eP) { printl("[WARN] ÉÏÏßÏûÏ¢·¢²¼Òì³£: " + eP.message); }

  468.         return true;
  469.     } catch (e3) {
  470.         G.connected = false;
  471.         logConnErr("½×¶Î3 Ö´ÐÐÁ¬½Ó", e3);
  472.         return false;
  473.     }
  474. }

  475. // ========== ¶Ï¿ªÁ¬½Ó ==========
  476. function disconnect() {
  477.     if (G.mqttClient) {
  478.         try {
  479.             if (G.connected) {
  480.                 publish(getPubTopic("offline"), {
  481.                     clientId: CFG.clientId,
  482.                     ts: nowSec()
  483.                 }, 0);
  484.             }
  485.             G.mqttClient.disconnect();
  486.             printl("[INFO] ÒѶϿª MQTT Á¬½Ó");
  487.         } catch (e) {
  488.             printl("[WARN] ¶Ï¿ªÒì³£: " + e.message);
  489.         }
  490.     }
  491.     G.connected = false;
  492. }

  493. // ========== ¹Ø±ÕÇåÀí ==========
  494. function cleanup() {
  495.     G.running = false;
  496.     disconnect();
  497.     try {
  498.         if (G.mqttClient) {
  499.             G.mqttClient.close(true);
  500.         }
  501.     } catch (e) {}
  502.     printl("[INFO] ×ÊÔ´ÒÑÇåÀí");
  503. }

  504. // ========== Ö÷³ÌÐò ==========
  505. function main() {
  506.     try {
  507.         G.startTime = nowSec();

  508.         printl("[INFO] ==========================================");
  509.         printl("[INFO]   MQTT ¿Í»§¶Ë (Eclipse Paho) Æô¶¯");
  510.         printl("[INFO]   Broker: " + CFG.brokerUrl);
  511.         printl("[INFO]   ClientID: " + (CFG.clientId || "×Ô¶¯Éú³É"));
  512.         printl("[INFO]   ÐÄÌø: " + CFG.keepAliveSec + "s");
  513.         printl("[INFO]   ×Ô¶¯ÖØÁ¬: " + CFG.autoReconnect);
  514.         printl("[INFO]   CleanSession: " + CFG.cleanSession);
  515.         printl("[INFO]   ¶©ÔÄÖ÷Ìâ: " + CFG.subscribeTopics.length + " ¸ö");
  516.         printl("[INFO]   É豸ÐÅÏ¢: " + JSON.stringify(getDeviceInfo()));
  517.         printl("[INFO] ==========================================");

  518.         if (!connect()) {
  519.             startReconnectLoop();
  520.         }

  521.         var tick = 0;
  522.         (function keepAlive() {
  523.             try {
  524.                 if (!G.running) {
  525.                     printl("[INFO] Ö÷Ï̱߳£»îÍ˳ö");
  526.                     return;
  527.                 }
  528.                 tick++;
  529.                 if (tick % 30 === 0) {
  530.                     printl("[INFO] [±£»î] ÒÑÔËÐÐ=" + (nowSec() - G.startTime) +
  531.                         "s Á¬½Ó=" + G.connected +
  532.                         " ·¢ËÍ=" + G.msgSentCount +
  533.                         " ½ÓÊÕ=" + G.msgRecvCount +
  534.                         " ÖØÁ¬=" + G.reconnectCount);
  535.                 }
  536.             } catch (e) {
  537.                 printl("[ERROR] ±£»îÒì³£(ÒѶµ×¡): " + e.message);
  538.             }
  539.             try { setTimeout(keepAlive, 1000); }
  540.             catch (e) {
  541.                 try { runTime.setTimeout(keepAlive, 1000); } catch (e2) {}
  542.             }
  543.         })();

  544.         if (CFG.runDuration > 0) {
  545.             sleep.millisecond(CFG.runDuration);
  546.             cleanup();
  547.         }

  548.     } catch (e) {
  549.         printl("[FATAL] Ö÷³ÌÐòÒì³£: " + e.message + "\n" + (e.stack || ""));
  550.         try { cleanup(); } catch (e2) {}
  551.     }
  552. }

  553. // ========== ÊÖ¶¯ÖØÁ¬Ñ­»· ==========
  554. function startReconnectLoop() {
  555.     (function reconnectStep() {
  556.         try {
  557.             if (!G.running) return;
  558.             if (G.connected) return;

  559.             G.reconnectCount++;
  560.             printl("[INFO] ÊÖ¶¯ÖØÁ¬³¢ÊÔ " + G.reconnectCount);

  561.             if (connect()) {
  562.                 printl("[INFO] ÊÖ¶¯ÖØÁ¬³É¹¦");
  563.                 return;
  564.             }

  565.             setTimeout(reconnectStep, CFG.reconnectDelayMs);
  566.         } catch (e) {
  567.             printl("[ERROR] ÖØÁ¬Òì³£(ÒѶµ×¡): " + e.message);
  568.             setTimeout(reconnectStep, CFG.reconnectDelayMs);
  569.         }
  570.     })();
  571. }

  572. // ========== Æô¶¯ ==========
  573. main();
¸´ÖÆ´úÂë


»Ø¸´

ʹÓõÀ¾ß ¾Ù±¨

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

¹Ø±Õ

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

map2

GMT+8, 2026-9-1 17:18 , Processed in 0.100205 second(s), 33 queries .

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