import config from '@/config' /** * 测量数据 WebSocket(与 l2/socket/index.vue 类似) * 默认订阅 type=track_measure */ export function createMeasureSocket({ type = 'track_measure', onOpen, onClose, onError, onMessage } = {}) { let socket = null let manualClose = false const wsBase = (config.wsUrl || config.baseUrl || '').replace(/^http/, 'ws') const url = `${wsBase}/websocket?type=${type}` console.log(url) function connect() { manualClose = false // 使用 uni.connectSocket 建立连接(部分运行环境可能不支持 WebSocket,会直接抛异常) try { socket = uni.connectSocket({ url, success() { console.log('connectSocket 调用成功,等待 onOpen 回调') }, fail(err) { console.error('connectSocket 调用失败:', err) onError && onError(err) } }) } catch (err) { console.error('connectSocket 执行异常(可能环境不支持 WebSocket):', err) onError && onError(err) return } if (!socket) { console.error('connectSocket 未返回有效 socketTask') return } // 正确的事件注册方式:socketTask.onOpen / onMessage / onError / onClose socket.onOpen((res) => { console.log('WebSocket 已打开', res) onOpen && onOpen(res) }) socket.onMessage((evt) => { // H5 为 evt.data,小程序为 evt.data,统一兼容 const data = evt && (evt.data || evt) onMessage && onMessage(data) }) socket.onError((err) => { console.error('WebSocket 发生错误:', err) onError && onError(err) }) socket.onClose((evt) => { console.log('WebSocket 已关闭', evt) onClose && onClose(evt) if (!manualClose) { setTimeout(connect, 3000) } }) } function close() { manualClose = true if (socket) { socket.close(1000, 'client close') socket = null } } function send(data) { if (!socket) { console.error('WebSocket 未初始化,无法发送消息') return } // uni-app 的 socketTask.send 使用对象形式 socket.send({ data: JSON.stringify(data), fail(err) { console.error('发送 WebSocket 消息失败:', err) } }) } return { connect, close, send } }