import { getWebSocketUrl } from '@/defaultBaseUrl' export default { isOpen: false, isOpening: false, socketTask: false, timeoutID: -1, regData: '', webSocketUrl: getWebSocketUrl(), //开始心跳 heartbeatStart() { if (this.timeoutID != -1) { this.heartbeatClear() } this.timeoutID = setTimeout(() => { this.socketTask.send({ data: 'ping' }) }, 15000) }, //清理心跳 heartbeatClear() { clearTimeout(this.timeoutID) }, //重置心跳 heartbeatReset() { this.heartbeatClear() this.heartbeatStart() }, //注册用户 regUser() { this.socketTask.send({ data: this.regData }) }, //设置连接注册数据 setRegData(regData) { this.regData = regData }, //打开连接 open() { if (this.regData === '') { console.log('请先调用setRegData方法设置注册数据!!!') return } //防止重复连接 if (this.isOpening) { console.log('WebSocket正在连接。。。') return } if (this.isOpen && this.socketTask) { console.log('WebSocket已连接。。。') return } // console.log("WebSocket开始连接。。。"); this.isOpening = true let socketTask = uni.connectSocket({ url: this.webSocketUrl, header: { 'content-type': 'application/json' }, success: e => { // console.log(e); }, complete: () => {} }) if (!socketTask) return // console.log(socketTask); this.socketTask = socketTask //监听开启 socketTask.onOpen(res => { this.isOpen = true this.isOpening = false // console.log("WebSocket连接成功。。。"); this.regUser(this.regData) }) //监听消息 socketTask.onMessage(res => { if (res.data.replace(/^\s+|\s+$/g, '') === 'pong') { this.heartbeatReset() return } let data = JSON.parse(res.data) this.message(data) }) //监听关闭 socketTask.onClose(res => { this.isOpen = false this.isOpening = false this.socketTask = false // console.log("WebSocket连接关闭。。。"); uni.$emit('connClose', res) this.heartbeatClear() this.reOpen() }) //监听错误 socketTask.onError(res => { this.isOpen = false this.isOpening = false this.socketTask = false console.log('WebSocket连接失败。。。') this.heartbeatClear() this.reOpen() }) }, //消息处理 message(data) { switch (data.cmd) { case 'replyRegister': if (data.data.success) { console.log('注册成功!') //注册成功开始心跳 this.heartbeatStart() } break case 'replyControlMeasurePoint': uni.$emit('controlMeasurePoint', data) break case 'replyControlDevice': uni.$emit('controlDevice', data.data) break case 'deviceStatus': uni.$emit('deviceStatus', data.data) break case 'deviceData': uni.$emit('deviceData', data.data) break case 'sellerData': uni.$emit('sellerData', data.data) break case 'buyerData': uni.$emit('buyerData', data.data) break case 'goodsData': uni.$emit('goodsData', data.data) break case 'logData': uni.$emit('logData', data.data) break case 'measurePointStatus': uni.$emit('measurePointStatus', data.data) break case 'replyMeasureData': uni.$emit('replyMeasureData', data.data) break case 'replySaveMeasureData': uni.$emit('replySaveMeasureData', data.data) break } }, //重新打开 reOpen() { this.timeoutID = setTimeout(() => { this.open() }, 5000) }, //关闭连接 close() { if (this.isOpen) { this.socketTask.close() } }, //发送消息 send(data) { console.log('发送消息。。。', data) if (!this.isOpen) { //关闭则打开 this.open() } if (this.socketTask) { this.socketTask.send({ data: data }) } } }