Monitor-APP/manifest.json | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Monitor-APP/pages/home/home.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Monitor-APP/static/js/WebSocketClient.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Monitor-APP/static/js/WebSocketClient02.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
Monitor-APP/static/js/dispatcher.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
Monitor-APP/manifest.json
@@ -26,22 +26,165 @@ /* android打包配置 */ "android" : { "permissions" : [ "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", "<uses-permission android:name=\"android.permission.VIBRATE\"/>", "<uses-permission android:name=\"android.permission.READ_LOGS\"/>", "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", "<uses-permission android:name=\"android.permission.CAMERA\"/>", "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", "<uses-feature android:name=\"android.hardware.camera\"/>", "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" ] "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>", "<uses-permission android:name=\"android.permission.ACCESS_CHECKIN_PROPERTIES\"/>", "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_LOCATION_EXTRA_COMMANDS\"/>", "<uses-permission android:name=\"android.permission.ACCESS_MOCK_LOCATION\"/>", "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>", "<uses-permission android:name=\"android.permission.ACCESS_SURFACE_FLINGER\"/>", "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>", "<uses-permission android:name=\"android.permission.ACCOUNT_MANAGER\"/>", "<uses-permission android:name=\"android.permission.ADD_VOICEMAIL\"/>", "<uses-permission android:name=\"android.permission.AUTHENTICATE_ACCOUNTS\"/>", "<uses-permission android:name=\"android.permission.BATTERY_STATS\"/>", "<uses-permission android:name=\"android.permission.BIND_ACCESSIBILITY_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_APPWIDGET\"/>", "<uses-permission android:name=\"android.permission.BIND_CARRIER_MESSAGING_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_DEVICE_ADMIN\"/>", "<uses-permission android:name=\"android.permission.BIND_DREAM_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_INPUT_METHOD\"/>", "<uses-permission android:name=\"android.permission.BIND_NFC_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_NOTIFICATION_LISTENER_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_PRINT_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_REMOTEVIEWS\"/>", "<uses-permission android:name=\"android.permission.BIND_TEXT_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_TV_INPUT\"/>", "<uses-permission android:name=\"android.permission.BIND_VOICE_INTERACTION\"/>", "<uses-permission android:name=\"android.permission.BIND_VPN_SERVICE\"/>", "<uses-permission android:name=\"android.permission.BIND_WALLPAPER\"/>", "<uses-permission android:name=\"android.permission.BLUETOOTH\"/>", "<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\"/>", "<uses-permission android:name=\"android.permission.BLUETOOTH_PRIVILEGED\"/>", "<uses-permission android:name=\"android.permission.BODY_SENSORS\"/>", "<uses-permission android:name=\"android.permission.BRICK\"/>", "<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_REMOVED\"/>", "<uses-permission android:name=\"android.permission.BROADCAST_SMS\"/>", "<uses-permission android:name=\"android.permission.BROADCAST_STICKY\"/>", "<uses-permission android:name=\"android.permission.BROADCAST_WAP_PUSH\"/>", "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>", "<uses-permission android:name=\"android.permission.CALL_PRIVILEGED\"/>", "<uses-permission android:name=\"android.permission.CAMERA\"/>", "<uses-permission android:name=\"android.permission.CAPTURE_AUDIO_OUTPUT\"/>", "<uses-permission android:name=\"android.permission.CAPTURE_SECURE_VIDEO_OUTPUT\"/>", "<uses-permission android:name=\"android.permission.CAPTURE_VIDEO_OUTPUT\"/>", "<uses-permission android:name=\"android.permission.CHANGE_COMPONENT_ENABLED_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_CONFIGURATION\"/>", "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_WIFI_MULTICAST_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>", "<uses-permission android:name=\"android.permission.CLEAR_APP_CACHE\"/>", "<uses-permission android:name=\"android.permission.CLEAR_APP_USER_DATA\"/>", "<uses-permission android:name=\"android.permission.CONTROL_LOCATION_UPDATES\"/>", "<uses-permission android:name=\"android.permission.DELETE_CACHE_FILES\"/>", "<uses-permission android:name=\"android.permission.DELETE_PACKAGES\"/>", "<uses-permission android:name=\"android.permission.DEVICE_POWER\"/>", "<uses-permission android:name=\"android.permission.DIAGNOSTIC\"/>", "<uses-permission android:name=\"android.permission.DISABLE_KEYGUARD\"/>", "<uses-permission android:name=\"android.permission.DUMP\"/>", "<uses-permission android:name=\"android.permission.EXPAND_STATUS_BAR\"/>", "<uses-permission android:name=\"android.permission.FACTORY_TEST\"/>", "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", "<uses-permission android:name=\"android.permission.FORCE_BACK\"/>", "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>", "<uses-permission android:name=\"android.permission.GET_PACKAGE_SIZE\"/>", "<uses-permission android:name=\"android.permission.GET_TASKS\"/>", "<uses-permission android:name=\"android.permission.GET_TOP_ACTIVITY_INFO\"/>", "<uses-permission android:name=\"android.permission.GLOBAL_SEARCH\"/>", "<uses-permission android:name=\"android.permission.HARDWARE_TEST\"/>", "<uses-permission android:name=\"android.permission.INJECT_EVENTS\"/>", "<uses-permission android:name=\"android.permission.INSTALL_LOCATION_PROVIDER\"/>", "<uses-permission android:name=\"android.permission.INSTALL_PACKAGES\"/>", "<uses-permission android:name=\"android.permission.INSTALL_SHORTCUT\"/>", "<uses-permission android:name=\"android.permission.INTERNAL_SYSTEM_WINDOW\"/>", "<uses-permission android:name=\"android.permission.INTERNET\"/>", "<uses-permission android:name=\"android.permission.KILL_BACKGROUND_PROCESSES\"/>", "<uses-permission android:name=\"android.permission.LOCATION_HARDWARE\"/>", "<uses-permission android:name=\"android.permission.MANAGE_ACCOUNTS\"/>", "<uses-permission android:name=\"android.permission.MANAGE_APP_TOKENS\"/>", "<uses-permission android:name=\"android.permission.MANAGE_DOCUMENTS\"/>", "<uses-permission android:name=\"android.permission.MASTER_CLEAR\"/>", "<uses-permission android:name=\"android.permission.MEDIA_CONTENT_CONTROL\"/>", "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>", "<uses-permission android:name=\"android.permission.MODIFY_PHONE_STATE\"/>", "<uses-permission android:name=\"android.permission.MOUNT_FORMAT_FILESYSTEMS\"/>", "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", "<uses-permission android:name=\"android.permission.NFC\"/>", "<uses-permission android:name=\"android.permission.PERSISTENT_ACTIVITY\"/>", "<uses-permission android:name=\"android.permission.PROCESS_OUTGOING_CALLS\"/>", "<uses-permission android:name=\"android.permission.READ_CALENDAR\"/>", "<uses-permission android:name=\"android.permission.READ_CALL_LOG\"/>", "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>", "<uses-permission android:name=\"android.permission.READ_EXTERNAL_STORAGE\"/>", "<uses-permission android:name=\"android.permission.READ_FRAME_BUFFER\"/>", "<uses-permission android:name=\"android.permission.READ_HISTORY_BOOKMARKS\"/>", "<uses-permission android:name=\"android.permission.READ_INPUT_STATE\"/>", "<uses-permission android:name=\"android.permission.READ_LOGS\"/>", "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>", "<uses-permission android:name=\"android.permission.READ_PROFILE\"/>", "<uses-permission android:name=\"android.permission.READ_SMS\"/>", "<uses-permission android:name=\"android.permission.READ_SOCIAL_STREAM\"/>", "<uses-permission android:name=\"android.permission.READ_SYNC_SETTINGS\"/>", "<uses-permission android:name=\"android.permission.READ_SYNC_STATS\"/>", "<uses-permission android:name=\"android.permission.READ_USER_DICTIONARY\"/>", "<uses-permission android:name=\"android.permission.READ_VOICEMAIL\"/>", "<uses-permission android:name=\"android.permission.REBOOT\"/>", "<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\"/>", "<uses-permission android:name=\"android.permission.RECEIVE_MMS\"/>", "<uses-permission android:name=\"android.permission.RECEIVE_SMS\"/>", "<uses-permission android:name=\"android.permission.RECEIVE_WAP_PUSH\"/>", "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>", "<uses-permission android:name=\"android.permission.REORDER_TASKS\"/>", "<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\"/>", "<uses-permission android:name=\"android.permission.RESTART_PACKAGES\"/>", "<uses-permission android:name=\"android.permission.SEND_RESPOND_VIA_MESSAGE\"/>", "<uses-permission android:name=\"android.permission.SEND_SMS\"/>", "<uses-permission android:name=\"android.permission.SET_ACTIVITY_WATCHER\"/>", "<uses-permission android:name=\"android.permission.SET_ALARM\"/>", "<uses-permission android:name=\"android.permission.SET_ALWAYS_FINISH\"/>", "<uses-permission android:name=\"android.permission.SET_ANIMATION_SCALE\"/>", "<uses-permission android:name=\"android.permission.SET_DEBUG_APP\"/>", "<uses-permission android:name=\"android.permission.SET_ORIENTATION\"/>", "<uses-permission android:name=\"android.permission.SET_POINTER_SPEED\"/>", "<uses-permission android:name=\"android.permission.SET_PREFERRED_APPLICATIONS\"/>", "<uses-permission android:name=\"android.permission.SET_PROCESS_LIMIT\"/>", "<uses-permission android:name=\"android.permission.SET_TIME\"/>", "<uses-permission android:name=\"android.permission.SET_TIME_ZONE\"/>", "<uses-permission android:name=\"android.permission.SET_WALLPAPER\"/>", "<uses-permission android:name=\"android.permission.SET_WALLPAPER_HINTS\"/>", "<uses-permission android:name=\"android.permission.SIGNAL_PERSISTENT_PROCESSES\"/>", "<uses-permission android:name=\"android.permission.STATUS_BAR\"/>", "<uses-permission android:name=\"android.permission.SUBSCRIBED_FEEDS_READ\"/>", "<uses-permission android:name=\"android.permission.SUBSCRIBED_FEEDS_WRITE\"/>", "<uses-permission android:name=\"android.permission.SYSTEM_ALERT_WINDOW\"/>", "<uses-permission android:name=\"android.permission.TRANSMIT_IR\"/>", "<uses-permission android:name=\"android.permission.UNINSTALL_SHORTCUT\"/>", "<uses-permission android:name=\"android.permission.UPDATE_DEVICE_STATS\"/>", "<uses-permission android:name=\"android.permission.USE_CREDENTIALS\"/>", "<uses-permission android:name=\"android.permission.USE_FINGERPRINT\"/>", "<uses-permission android:name=\"android.permission.USE_SIP\"/>", "<uses-permission android:name=\"android.permission.VIBRATE\"/>", "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", "<uses-permission android:name=\"android.permission.WRITE_APN_SETTINGS\"/>", "<uses-permission android:name=\"android.permission.WRITE_CALENDAR\"/>", "<uses-permission android:name=\"android.permission.WRITE_CALL_LOG\"/>", "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>", "<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\"/>", "<uses-permission android:name=\"android.permission.WRITE_GSERVICES\"/>", "<uses-permission android:name=\"android.permission.WRITE_HISTORY_BOOKMARKS\"/>", "<uses-permission android:name=\"android.permission.WRITE_PROFILE\"/>", "<uses-permission android:name=\"android.permission.WRITE_SECURE_SETTINGS\"/>", "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>", "<uses-permission android:name=\"android.permission.WRITE_SMS\"/>", "<uses-permission android:name=\"android.permission.WRITE_SOCIAL_STREAM\"/>", "<uses-permission android:name=\"android.permission.WRITE_SYNC_SETTINGS\"/>", "<uses-permission android:name=\"android.permission.WRITE_USER_DICTIONARY\"/>", "<uses-permission android:name=\"android.permission.WRITE_VOICEMAIL\"/>", "<uses-permission android:name=\"android.permission.RECEIVE_USER_PRESENT\"/>" ], "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ] }, /* ios打包配置 */ "ios" : { Monitor-APP/pages/home/home.vue
@@ -328,6 +328,7 @@ <script> import demodata from '@/mockdata/demodata.json'; import ycqdata from '@/pages/index/data.json'; import {WebSocketClient} from "@/static/js/WebSocketClient" export default { data() { return { @@ -416,42 +417,148 @@ // this.getUrl() }, onLoad() { // this.ws() setInterval(()=>{ this.getServerData() this.initlineChart() this.initPieChart() this.getOther() this.getDate() this.getDate2() this.getInfo() this.getError() // this.getInfo2() // this.getError2() this.getUrl() // this.initlineChart() // this.initPieChart() // this.getOther() // // this.getDate() // this.getDate2() // this.getInfo() // this.getError() // // this.getInfo2() // // this.getError2() // this.getUrl() this.controller() // this.statisticalModel() // 测试用 },1000) setInterval(()=> { setTimeout(()=>{ plus.runtime.restart(); },100) },1000*60*60*4) setInterval(()=> { setTimeout(()=>{ var time = new Date(); var hh = time.getHours(); var mm = time.getMinutes(); if(hh > this.oldHours && mm >this.oldMin && this.oldMin - mm < 55){ plus.runtime.restart(); } if(mm >this.oldMin && mm - this.oldMin >2){ plus.runtime.restart(); } },100) },1000*30) }, created() { let that = this const BaseIP = uni.getStorageSync('BaseIp'); const BaseLedId = uni.getStorageSync('BaseLedId'); const BasePort = uni.getStorageSync('BasePort'); const BaseCrnId = uni.getStorageSync('BaseCrnId'); const PROJ = uni.getStorageSync('UPROJ'); that.baseUrl = "pswcs" that.baseIP = "10.10.10.230" that.baseLedId = BaseLedId that.basePort = "9090" that.baseCrnId = BaseCrnId that.webSockerInit(); }, methods: { ws() { let _this = this _this.connectWS() uni.onSocketOpen(function (res) { console.log("Open"); }) uni.onSocketClose(function (res) { console.log("Close"); setInterval(()=>{ _this.connectWS() },1000) }) }, connectWS() { uni.connectSocket({ url: `http://127.0.0.1:9090/pswcs/console/websocket`, }) webSockerInit(){ let that = this; that.commonUrl = that.baseIP + ':' +that.basePort + "/" +that.baseUrl let socketUrl = "ws://"+that.commonUrl+"/led/"+that.baseLedId // socketUrl = "ws://10.0.100.150:8080/gtctu/led/113" const ws = new WebSocketClient(socketUrl); ws.connect() ws.onmessage((msg)=>{ let data = JSON.parse(msg.data) if(data.type === "default"){ that.chartsData.Pie.series[0].data = data.pie that.baseInfo.stockCount = data.stockCunt that.baseInfo.emptyCount = data.emptyCount that.baseInfo.noneCount =data.noneCount that.baseInfo.used = data.used that.baseInfo.usedPr = data.usedPr that.chartsData.Line.categories = [ that.getDateFormat(-11),that.getDateFormat(-10),that.getDateFormat(-9),that.getDateFormat(-8), that.getDateFormat(-7),that.getDateFormat(-6),that.getDateFormat(-5),that.getDateFormat(-4), that.getDateFormat(-3),that.getDateFormat(-2),that.getDateFormat(-1),that.getDateFormat(0),] that.chartsData.Line.series = data.rows that.calendar = data.year + "年" + data.month + "月" + data.day + "日 " + data.hour + ":" + data.minute + ":" + data.second + " " + data.week that.currDate = data.year + "/" + data.month + "/" + data.day that.locList = data.inventoryData that.oldHours = data.hour that.oldMin = data.minute }else if(data.type === "error"){ if (data.errMsg && data.errMsg !== "") { var errorInfo = data.errMsg if (that.infoType == 1) { that.infoType = 3 that.infoText.title = "其他信息" // that.infoText.title = "异常" that.infoText.error = errorInfo return } that.infoType = 2 that.infoText.title = "其他信息" // that.infoText.title = "异常" that.infoText.error = errorInfo } else { if (that.infoType == 1) { return } that.infoType = 0 } }else if(data.type === "task"){ if (data.taskList && data.taskList !== "" && data.taskList.length !=0) { if (that.infoType == 2 || that.infoType == 3) { return; } // infoType1:只有拣料等信息 that.infoType = 1 if (data.taskList[0].ioType === 101) { that.infoText.title = '全板出库' } else if(data.taskList[0].ioType === 103) { that.infoText.title = '拣料出库' } else if(data.taskList[0].ioType === 107) { that.infoText.title = '盘点出库' } else if(data.taskList[0].ioType === 1) { that.infoText.title = '入库' } else if(data.taskList[0].ioType === 10) { that.infoText.title = '空托入库' } else if(data.taskList[0].ioType === 110) { that.infoText.title = '空托出库' }else if(data.taskList[0].ioType === 104) { that.infoText.title = '并板出库' } that.infoText.barcode = data.taskList[0].barcode that.infoText.workNo = data.taskList[0].workNo that.infoText.sourceLocNo = data.taskList[0].sourceLocNo that.infoText.staNo = data.taskList[0].staNo that.swiperList = data.taskList[0].matDtos // that.infoText.matnr = res.data[0].matDtos[0].matnr // that.infoText.specs = res.data[0].matDtos[0].specs // that.infoText.maknx = res.data[0].matDtos[0].maknx // that.infoText.count = res.data[0].matDtos[0].count } else { if (that.infoType == 2 || that.infoType == 3) { return; } that.infoType = 0 } } }) }, timeOut1() { console.log(this.times); Monitor-APP/static/js/WebSocketClient.js
New file @@ -0,0 +1,191 @@ import { EventDispatcher } from './dispatcher'; export class WebSocketClient extends EventDispatcher { // #socket链接 url = ''; // #socket实例 socket = null; // #重连次数 reconnectAttempts = 0; // #最大重连数 maxReconnectAttempts = 20; // #重连间隔 reconnectInterval = 60000; // 10 seconds // #发送心跳数据间隔 heartbeatInterval = 1000 * 30; // #计时器id heartbeatTimer = undefined; // #彻底终止ws stopWs = false; // *构造函数 constructor(url) { super(); this.url = url; } // >生命周期钩子 onopen(callBack) { this.addEventListener('open', callBack); } onmessage(callBack) { this.addEventListener('message', callBack); } onclose(callBack) { this.addEventListener('close', callBack); } onerror(callBack) { this.addEventListener('error', callBack); } // >消息发送 send(message) { if (this.socket && this.socket.readyState === WebSocket.OPEN) { this.socket.send({ data:message, }); } else { console.error('[WebSocket] 未连接'); } } // !初始化连接 connect() { if (this.reconnectAttempts === 0) { this.log('WebSocket', `初始化连接中... ${this.url}`); } if (this.socket && this.socket.readyState === WebSocket.OPEN) { return; } this.socket = uni.connectSocket({ url: this.url, complete: ()=> {} }); this.socket.onOpen((event)=>{ this.stopWs = false; // 重置重连尝试成功连接 this.reconnectAttempts = 0; // 在连接成功时停止当前的心跳检测并重新启动 this.startHeartbeat(); this.log('WebSocket', `连接成功,等待服务端数据推送[onopen]... ${this.url}`); this.dispatchEvent('open', event); }) // !websocket连接成功 // this.socket.onOpen = event => { // this.stopWs = false; // // 重置重连尝试成功连接 // this.reconnectAttempts = 0; // // 在连接成功时停止当前的心跳检测并重新启动 // this.startHeartbeat(); // this.log('WebSocket', `连接成功,等待服务端数据推送[onopen]... ${this.url}`); // this.dispatchEvent('open', event); // }; this.socket.onMessage((event)=>{ this.dispatchEvent('message', event); this.startHeartbeat(); }) // this.socket.onMessage = event => { // console.log(event) // this.dispatchEvent('message', event); // this.startHeartbeat(); // }; this.socket.onClose((event)=>{ if (this.reconnectAttempts === 0) { this.log('WebSocket', `连接断开[onclose]... ${this.url}`); } if (!this.stopWs) { this.handleReconnect(); } this.dispatchEvent('close', event); }) // this.socket.onClose = event => { // if (this.reconnectAttempts === 0) { // this.log('WebSocket', `连接断开[onclose]... ${this.url}`); // } // if (!this.stopWs) { // this.handleReconnect(); // } // this.dispatchEvent('close', event); // }; this.socket.onError((event)=>{ if (this.reconnectAttempts === 0) { this.log('WebSocket', `连接异常[onerror]... ${this.url}`); } if (!this.stopWs) { this.handleReconnect(); } this.closeHeartbeat(); this.dispatchEvent('error', event); }) // uni.onSocketError((event)=>{ // console.log("333") // if (this.reconnectAttempts === 0) { // this.log('WebSocket', `连接异常[onerror]... ${this.url}`); // } // if (!this.stopWs) { // this.handleReconnect(); // } // this.closeHeartbeat(); // this.dispatchEvent('error', event); // }) // this.socket.onError = event => { // if (this.reconnectAttempts === 0) { // this.log('WebSocket', `连接异常[onerror]... ${this.url}`); // } // this.closeHeartbeat(); // this.dispatchEvent('error', event); // }; } // > 断网重连逻辑 handleReconnect() { if (this.reconnectAttempts < this.maxReconnectAttempts) { this.reconnectAttempts++; this.log('WebSocket', `尝试重连... (${this.reconnectAttempts}/${this.maxReconnectAttempts}) ${this.url}`); setTimeout(() => { this.connect(); }, this.reconnectInterval); } else { plus.runtime.restart(); // this.closeHeartbeat(); // this.log('WebSocket', `最大重连失败,终止重连: ${this.url}`); } } // >关闭连接 close() { if (this.socket) { this.stopWs = true; this.socket.close(); this.socket = null; this.removeEventListener('open'); this.removeEventListener('message'); this.removeEventListener('close'); this.removeEventListener('error'); } this.closeHeartbeat(); } // >开始心跳检测 -> 定时发送心跳消息 startHeartbeat() { if (this.stopWs) return; if (this.heartbeatTimer) { this.closeHeartbeat(); } this.heartbeatTimer = setInterval(() => { if (this.socket) { this.socket.send({ data: JSON.stringify({ type: 'heartBeat', data: {} }), }); this.log('WebSocket', '送心跳数据...'); } else { console.error('[WebSocket] 未连接'); } }, this.heartbeatInterval); } // >关闭心跳 closeHeartbeat() { clearInterval(this.heartbeatTimer); this.heartbeatTimer = undefined; } } Monitor-APP/static/js/WebSocketClient02.js
New file @@ -0,0 +1,141 @@ // import { EventDispatcher } from './dispatcher'; export class WebSocketClient extends EventDispatcher { // #socket链接 url = ''; // #socket实例 socket = null; // #重连次数 reconnectAttempts = 0; // #最大重连数 maxReconnectAttempts = 5; // #重连间隔 reconnectInterval = 10000; // 10 seconds // #发送心跳数据间隔 heartbeatInterval = 1000 * 30; // #计时器id heartbeatTimer = undefined; // #彻底终止ws stopWs = false; // *构造函数 constructor(url) { super(); this.url = url; } // >生命周期钩子 onopen(callBack) { this.addEventListener('open', callBack); } onmessage(callBack) { this.addEventListener('message', callBack); } onclose(callBack) { this.addEventListener('close', callBack); } onerror(callBack) { this.addEventListener('error', callBack); } // >消息发送 send(message) { if (this.socket && this.socket.readyState === WebSocket.OPEN) { this.socket.send(message); } else { console.error('[WebSocket] 未连接'); } } // !初始化连接 connect() { if (this.reconnectAttempts === 0) { this.log('WebSocket', `初始化连接中... ${this.url}`); } if (this.socket && this.socket.readyState === WebSocket.OPEN) { return; } this.socket = new WebSocket(this.url); // !websocket连接成功 this.socket.onopen = event => { this.stopWs = false; // 重置重连尝试成功连接 this.reconnectAttempts = 0; // 在连接成功时停止当前的心跳检测并重新启动 this.startHeartbeat(); this.log('WebSocket', `连接成功,等待服务端数据推送[onopen]... ${this.url}`); this.dispatchEvent('open', event); }; this.socket.onmessage = event => { this.dispatchEvent('message', event); this.startHeartbeat(); }; this.socket.onclose = event => { if (this.reconnectAttempts === 0) { this.log('WebSocket', `连接断开[onclose]... ${this.url}`); } if (!this.stopWs) { this.handleReconnect(); } this.dispatchEvent('close', event); }; this.socket.onerror = event => { if (this.reconnectAttempts === 0) { this.log('WebSocket', `连接异常[onerror]... ${this.url}`); } this.closeHeartbeat(); this.dispatchEvent('error', event); }; } // > 断网重连逻辑 handleReconnect() { if (this.reconnectAttempts < this.maxReconnectAttempts) { this.reconnectAttempts++; this.log('WebSocket', `尝试重连... (${this.reconnectAttempts}/${this.maxReconnectAttempts}) ${this.url}`); setTimeout(() => { this.connect(); }, this.reconnectInterval); } else { this.closeHeartbeat(); this.log('WebSocket', `最大重连失败,终止重连: ${this.url}`); } } // >关闭连接 close() { if (this.socket) { this.stopWs = true; this.socket.close(); this.socket = null; this.removeEventListener('open'); this.removeEventListener('message'); this.removeEventListener('close'); this.removeEventListener('error'); } this.closeHeartbeat(); } // >开始心跳检测 -> 定时发送心跳消息 startHeartbeat() { if (this.stopWs) return; if (this.heartbeatTimer) { this.closeHeartbeat(); } this.heartbeatTimer = setInterval(() => { if (this.socket) { this.socket.send(JSON.stringify({ type: 'heartBeat', data: {} })); this.log('WebSocket', '送心跳数据...'); } else { console.error('[WebSocket] 未连接'); } }, this.heartbeatInterval); } // >关闭心跳 closeHeartbeat() { clearInterval(this.heartbeatTimer); this.heartbeatTimer = undefined; } } Monitor-APP/static/js/dispatcher.js
New file @@ -0,0 +1,41 @@ class Log { static console = true; log(title, text) { // if (!Log.console) return; // if (import.meta.env.MODE === 'production') return; const color = '#ff4d4f'; console.log( `%c ${title} %c ${text} %c`, `background:${color};border:1px solid ${color}; padding: 1px; border-radius: 2px 0 0 2px; color: #fff;`, `border:1px solid ${color}; padding: 1px; border-radius: 0 2px 2px 0; color: ${color};`, 'background:transparent' ); } closeConsole() { Log.console = false; } } export class EventDispatcher extends Log { listeners = {}; addEventListener(type, listener) { if (!this.listeners[type]) { this.listeners[type] = []; } if (this.listeners[type].indexOf(listener) === -1) { this.listeners[type].push(listener); } } removeEventListener(type) { this.listeners[type] = []; } dispatchEvent(type, data) { const listenerArray = this.listeners[type] || []; if (listenerArray.length === 0) return; listenerArray.forEach(listener => { listener.call(this, data); }); } }