|
|
websocketÔ¶³ÌÍ£Ö¹ÊÖ»ú½ÓÊÕÆ÷
https://www.yuque.com/aiwork/nba2pr/htyaws99kck2ztr8
- // ============================================================================
- // ½ÓÈëʾÀý - ÄãµÄÒµÎñ½Å±¾ÈçºÎ½ÓÈ롸Զ³ÌÍ£Ö¹½ÓÊÕÆ÷¡¹
- // ============================================================================
- // ¡¾AIWROK ¼ÓÔØÃ÷ÎÄ JS µÄÕýÈ··½Ê½¡¿
- // - Import("xxx.js") ¡û Ö»ÄܼÓÔØ¼ÓÃܺóµÄ JS£¬Ã÷ÎIJ»ÐУ¡
- // - thread.runJsFile("xxx.js", "Ïß³ÌÃû") ¡û ¿ÉÒÔ¼ÓÔØÃ÷ÎÄ JS£¨ÍƼö£©
- //
- // ËùÒÔ½ÓÈëÖ»Ðè 3 ÐУº
- // var stopThread = new thread();
- // stopThread.runJsFile("Ô¶³ÌÍ£Ö¹½ÓÊÕÆ÷.js", "stop_receiver");
- //
- // ×ÓÏ̶߳ÀÁ¢ÉÏÏÂÎÄ£¬²»Ó°ÏìÖ÷½Å±¾ÒµÎñ
- // ÊÕµ½µçÄÔ¶Ë STOP_ALL Ö¸Áîʱ£¬×ÓÏ̵߳÷Óà runTime.stopAllRuning()
- // »áÍ£Ö¹ËùÓÐ×ÓỊ̈߳¨°üÀ¨Ëü×Ô¼º£©ºÍÖ÷½Å±¾
- // ============================================================================
- // === Æô¶¯Ô¶³ÌÍ£Ö¹½ÓÊÕÆ÷£¨×ÓỊ̈߳©===
- var stopThread = new thread();
- stopThread.runJsFile("Ô¶³ÌÍ£Ö¹½ÓÊÕÆ÷.js", "stop_receiver");
- // === ÒÔÏÂÊÇÄã×Ô¼ºµÄÒµÎñ´úÂ루ʾÀý£©===
- printl("=== ÎÒµÄÒµÎñ½Å±¾Æô¶¯ ===");
- // Ä£ÄâÒ»¸ö³¤Ê±¼äÔËÐеÄÈÎÎñ
- var counter = 0;
- while (true) {
- counter++;
- printl("ÒµÎñÖ´ÐÐÖÐ... µÚ" + counter + "´Î");
- try { sleep.second(2); } catch (e) { break; }
- // ÑÝʾ£ºÅÜ10´Îºó×Ô¼º½áÊø£¨Êµ¼Ê²»ÐèÒª£¬µçÄÔ·¢ STOP_ALL Ö¸Áî¾Í»áȫͣ£©
- if (counter >= 10) {
- printl("ÒµÎñÍê³É");
- break;
- }
- }
- printl("=== ÒµÎñ½Å±¾½áÊø ===");
- // ============================================================================
- // ¹¤×÷Á÷³Ì£º
- // 1. Ö÷½Å±¾Æô¶¯ ¡ú ´´½¨×ÓÏß³Ì stop_receiver£¨Á¬½ÓµçÄÔ·þÎñÆ÷£©
- // 2. Ö÷½Å±¾¼ÌÐøÅÜÒµÎñ
- // 3. µçÄԶ˵㡸һ¼üȫͣ¡¹¡ú ¹ã²¥ STOP_ALL
- // 4. ×ÓÏß³ÌÊÕµ½ ¡ú runTime.stopAllRuning() ¡ú Ö÷½Å±¾ + ËùÓÐ×ÓÏß³Ìȫͣ
- // ============================================================================
¸´ÖÆ´úÂë
- // ============================================================================
- // Ô¶³ÌÍ£Ö¹½ÓÊÕÆ÷ v5 - °´ÒÑÑéÖ¤¿ÉÓÃµÄ WebSocket Ä£Ê½ÖØÐ´
- // ============================================================================
- // ¡¾¼ÓÔØ·½Ê½¡¿ÔÚÖ÷½Å±¾¿ªÍ·¼Ó 3 ÐУº
- // var stopThread = new thread();
- // stopThread.runJsFile("Ô¶³ÌÍ£Ö¹½ÓÊÕÆ÷.js", "stop_receiver");
- //
- // ÅäÖ㺸ÄÏ·½ SERVER_IP ΪÄãµçÄԵľÖÓòÍø IP
- // ============================================================================
- var CONFIG = {
- SERVER_IP: "192.168.10.103",
- SERVER_PORT: "8886",
- WS_PATH: "/",
- DEVICE_NAME: "",
- PING_MS: 25000,
- RECONNECT_BASE_MS: 2000
- };
- // ============================================================================
- // È«¾Ö״̬
- // ============================================================================
- var G = {
- ws: null,
- connected: false,
- deviceName: "",
- lastPongAt: 0,
- heartbeatTimer: null,
- retryCount: 0,
- running: true
- };
- function LOG(tag, msg) {
- printl("[Í£Ö¹½ÓÊÕÆ÷][" + tag + "] " + msg);
- }
- function getDeviceName() {
- if (CONFIG.DEVICE_NAME) return CONFIG.DEVICE_NAME;
- try { return device.getBrand() + "_" + device.getModel(); }
- catch (e) { return "phone_" + new Date().getTime(); }
- }
- function sendMsg(type, data) {
- if (!G.ws || !G.connected) return false;
- try {
- var obj = { type: type, ts: new Date().getTime(), data: data || {} };
- G.ws.send(JSON.stringify(obj));
- return true;
- } catch (e) {
- LOG("ERROR", "send Òì³£: " + e);
- return false;
- }
- }
- // ============================================================================
- // ÐÄÌø£¨runTime.setTimeout µÝ¹é£¬ÓëÒÑÑéÖ¤´úÂëÒ»Ö£©
- // ============================================================================
- function startHeartbeat() {
- stopHeartbeat();
- G.lastPongAt = new Date().getTime();
- function tick() {
- if (!G.connected) return;
- var now = new Date().getTime();
- if (now - G.lastPongAt > CONFIG.PING_MS + 10000) {
- LOG("WARN", "ÐÄÌø³¬Ê±£¬Ö÷¶¯¶Ï¿ª");
- try { G.ws.close(); } catch (e) {}
- return;
- }
- sendMsg("PING", { t: now });
- G.heartbeatTimer = runTime.setTimeout(tick, CONFIG.PING_MS);
- }
- G.heartbeatTimer = runTime.setTimeout(tick, CONFIG.PING_MS);
- }
- function stopHeartbeat() {
- if (G.heartbeatTimer) {
- try { runTime.stopTimeout(G.heartbeatTimer); } catch (e) {}
- G.heartbeatTimer = null;
- }
- }
- // ============================================================================
- // Á¬½ÓºËÐÄ£¨ÍêÈ«ÕÕ°áÒÑÑéÖ¤µÄ WebSocketÊÖ»ú¶Ë³£ÓÃʵÀý.js ģʽ£©
- // ============================================================================
- function doConnect() {
- G.connected = false;
- G.deviceName = getDeviceName();
- var url = "ws://" + CONFIG.SERVER_IP + ":" + CONFIG.SERVER_PORT + CONFIG.WS_PATH;
- LOG("INFO", "Á¬½Ó " + url + " É豸=" + G.deviceName);
- var ws = new websocket();
- G.ws = ws;
- try { ws.setSocketID("stop_" + new Date().getTime()); } catch (e) {}
- // ¶¨ÒåËĸö»Øµ÷
- var _onOpen = function () {
- LOG("OK", "onopen ´¥·¢£¡Á¬½Ó³É¹¦");
- G.connected = true;
- G.retryCount = 0;
- G.lastPongAt = new Date().getTime();
- // Éϱ¨É豸ÐÅÏ¢
- sendMsg("REGISTER", { device: G.deviceName });
- startHeartbeat();
- };
- var _onMsg = function (msg) {
- try {
- var raw = "";
- try { raw = String(msg); } catch (e) { raw = "" + msg; }
- var obj = null;
- try { obj = JSON.parse(raw); } catch (e) { return; }
- var cmd = obj.cmd || "";
- var type = obj.type || "";
- if (cmd === "STOP_ALL") {
- LOG("WARN", ">>> ÊÕµ½È«Í£Ö¸Áî! <<<");
- _stopEverything();
- return;
- }
- if (type === "PING" || cmd === "PING") {
- sendMsg("PONG", { ts: new Date().getTime() });
- return;
- }
- if (type === "PONG") {
- G.lastPongAt = new Date().getTime();
- return;
- }
- } catch (e) {
- LOG("ERROR", "´¦ÀíÏûÏ¢Òì³£: " + e);
- }
- };
- var _onErr = function (err) {
- var m = "";
- try { m = String(err); } catch (e) {}
- LOG("WARN", "onerror: " + (m || "ÎÞÏêÇé"));
- G.connected = false;
- stopHeartbeat();
- };
- var _onClose = function () {
- LOG("INFO", "onclose£ºÁ¬½Ó¶Ï¿ª");
- G.connected = false;
- stopHeartbeat();
- };
- // ¢Ù ÓÅÏȳ¢ÊÔÊôÐÔ¸³Öµ£¨¹Ù·½Ê¾Àý websocket.js Óõķ½Ê½£©
- try {
- ws.onopen = _onOpen;
- ws.onmessage = _onMsg;
- ws.onerror = _onErr;
- ws.onclose = _onClose;
- LOG("INFO", "»Øµ÷×¢²á: ÊôÐÔ¸³Öµ");
- } catch (eProp) {
- LOG("WARN", "ÊôÐÔ¸³ÖµÊ§°Ü: " + eProp + "£¬³¢ÊÔ event()");
- // ¢Ú »ØÍË event(4²ÎÊý)
- try {
- ws.event(_onOpen, _onMsg, _onErr, _onClose);
- LOG("INFO", "»Øµ÷×¢²á: ws.event(4²ÎÊý)");
- } catch (eEvt) {
- LOG("ERROR", "Á½ÖÖ·½Ê½¶¼Ê§°Ü: " + eEvt);
- return false;
- }
- }
- // ·¢ÆðÁ¬½Ó
- try {
- LOG("INFO", "µ÷ÓÃ connet('" + url + "')...");
- ws.connet(url);
- } catch (e1) {
- try {
- LOG("WARN", "connet Å×Òì³£: " + e1 + "£¬³¢ÊÔ connect()");
- ws.connect(url);
- } catch (e2) {
- LOG("ERROR", "connet/connect ¾ùʧ°Ü: " + e1 + " / " + e2);
- return false;
- }
- }
- // µÈ´ý onopen£¨×î¶à 15 Ã룩
- var waitCount = 0;
- while (!G.connected && waitCount < 150) {
- sleep.millisecond(100);
- waitCount++;
- }
- if (G.connected) {
- LOG("OK", "ÒÑÁ¬½Ó ·þÎñÆ÷=" + CONFIG.SERVER_IP + ":" + CONFIG.SERVER_PORT);
- } else {
- LOG("WARN", "15 ÃëÄÚ onopen δ´¥·¢");
- }
- return G.connected;
- }
- // ============================================================================
- // Ö÷Ñ»·£ºÁ¬½Ó ¡ú µÈ´ý¶Ï¿ª ¡ú ÖØÁ¬
- // ============================================================================
- function mainLoop() {
- while (G.running) {
- G.retryCount++;
- if (G.retryCount > 999) {
- LOG("ERROR", "ÒÑ´ï×î´óÖØÁ¬´ÎÊý");
- break;
- }
- var ok = doConnect();
- if (!ok) {
- var waitMs = CONFIG.RECONNECT_BASE_MS * Math.min(Math.pow(2, G.retryCount - 1), 5);
- waitMs = waitMs + Math.floor(Math.random() * 1000);
- LOG("WARN", (waitMs / 1000).toFixed(1) + "s ºóÖØÁ¬ (µÚ" + G.retryCount + "´Î)");
- try { G.ws.close(); } catch (e) {}
- sleep.millisecond(waitMs);
- continue;
- }
- // ÒÑÁ¬½Ó£ºµÈ´ý¶Ï¿ª
- while (G.running && G.connected) {
- sleep.millisecond(500);
- }
- if (!G.running) break;
- // ¶ÏÏßÁË
- var waitMs2 = CONFIG.RECONNECT_BASE_MS * Math.min(Math.pow(2, G.retryCount - 1), 5);
- waitMs2 = waitMs2 + Math.floor(Math.random() * 1000);
- LOG("WARN", "¶ÏÏß " + (waitMs2 / 1000).toFixed(1) + "s ºóÖØÁ¬");
- try { G.ws.close(); } catch (e) {}
- sleep.millisecond(waitMs2);
- }
- stopHeartbeat();
- try { G.ws.close(); } catch (e) {}
- LOG("INFO", "½ÓÊÕÆ÷½áÊø");
- }
- // ============================================================================
- // ȫͣ
- // ============================================================================
- function _stopEverything() {
- LOG("WARN", ">>> Ö´ÐÐȫͣ <<<");
- G.running = false;
- try { runTime.stopAllRuning(); } catch (e) {}
- try { app.stopScript(); } catch (e) {}
- try { exit(); } catch (e) {}
- }
- // ============================================================================
- // Æô¶¯
- // ============================================================================
- LOG("INFO", "Ô¶³ÌÍ£Ö¹½ÓÊÕÆ÷ v5 Æô¶¯");
- mainLoop();
- LOG("INFO", "Æô¶¯Íê³É");
¸´ÖÆ´úÂë
|
|