/** * 监听报警 * 跟后端建websorcket通信,监听设备返回参数,如果一直在变则正常,不用报警,如果参数不变就考虑是断电等情况,需要报警 */ import { ElMessage } from 'element-plus' import { getToken } from '@/utils/auth.js' let wsUrl = ''; let socket = null;//实例对象 let lockReconnect = false; //是否真正建立连接 let timeout = 3 * 1000; //3秒一次心跳 let timeoutObj = null; //心跳倒计时 let serverTimeoutObj = null; //服务心跳倒计时 let timeoutnum = null; //断开 重连倒计时 // 初始 const initWebsocket = (url) => { if(url) wsUrl = url; if("WebSocket" in window) { socket = new WebSocket(wsUrl); socket.onerror = webSocketOnError; socket.onmessage = webSocketOnMessage; socket.onclose = closeWebsocket; socket.onopen = openWebsocket; } else { ElMessage.warning('你的浏览器不支持websocket,请更换浏览器') } } //建立连接 const openWebsocket = (e) => { start(); } const start = ()=> { //开启心跳 timeoutObj && clearTimeout(timeoutObj); serverTimeoutObj && clearTimeout(serverTimeoutObj); timeoutObj = setTimeout(function() { //这里发送一个心跳,后端收到后,返回一个心跳消息 if (socket.readyState == 1) { //如果连接正常 // socket.send("heartbeat"); } else { //否则重连 reconnect(); } serverTimeoutObj = setTimeout(function() { //超时关闭 socket.close(); }, timeout); }, timeout); } //重置心跳 const reset =() => { //清除时间 clearTimeout(timeoutObj); clearTimeout(serverTimeoutObj); //重启心跳 start(); } const sendWebsocket =(data) =>{ socket.send(data); } //服务器返回的数据 const webSocketOnMessage=(e) => { //判断是否登录 if (getToken()) { //window自定义事件,addEventListener监听onmessageWS事件 window.dispatchEvent( new CustomEvent("onmessageWS", { detail: { data: JSON.parse(e?.data), }, }) ); } reset(); } //重新连接 const reconnect =() => { if (lockReconnect) { return; } lockReconnect = true; //没连接上会一直重连,设置延迟避免请求过多 timeoutnum && clearTimeout(timeoutnum); timeoutnum = setTimeout(function() { //新连接 initWebsocket(); lockReconnect = false; }, 1000); } //断开连接 const close =() => { //WebSocket对象也有发送和关闭的两个方法,只需要在自定义方法中分别调用send()和close()即可实现。 socket.close(); } const closeWebsocket=(e) => { reconnect(); } const webSocketOnError =(e) => { reconnect(); } export default { initWebsocket, sendWebsocket, webSocketOnMessage, close };