2026-01-05 14:29:33 +08:00
|
|
|
|
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}`
|
2026-01-15 17:37:57 +08:00
|
|
|
|
console.log(url)
|
|
|
|
|
|
|
2026-01-05 14:29:33 +08:00
|
|
|
|
function connect() {
|
|
|
|
|
|
manualClose = false
|
2026-01-15 17:37:57 +08:00
|
|
|
|
|
|
|
|
|
|
// 使用 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
|
2026-01-05 14:29:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-15 17:37:57 +08:00
|
|
|
|
if (!socket) {
|
|
|
|
|
|
console.error('connectSocket 未返回有效 socketTask')
|
|
|
|
|
|
return
|
2026-01-05 14:29:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2026-01-15 17:37:57 +08:00
|
|
|
|
// 正确的事件注册方式: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)
|
2026-01-05 14:29:33 +08:00
|
|
|
|
onError && onError(err)
|
2026-01-15 17:37:57 +08:00
|
|
|
|
})
|
2026-01-05 14:29:33 +08:00
|
|
|
|
|
2026-01-15 17:37:57 +08:00
|
|
|
|
socket.onClose((evt) => {
|
|
|
|
|
|
console.log('WebSocket 已关闭', evt)
|
2026-01-05 14:29:33 +08:00
|
|
|
|
onClose && onClose(evt)
|
|
|
|
|
|
if (!manualClose) {
|
|
|
|
|
|
setTimeout(connect, 3000)
|
|
|
|
|
|
}
|
2026-01-15 17:37:57 +08:00
|
|
|
|
})
|
2026-01-05 14:29:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function close() {
|
|
|
|
|
|
manualClose = true
|
|
|
|
|
|
if (socket) {
|
|
|
|
|
|
socket.close(1000, 'client close')
|
|
|
|
|
|
socket = null
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function send(data) {
|
2026-01-15 17:37:57 +08:00
|
|
|
|
if (!socket) {
|
|
|
|
|
|
console.error('WebSocket 未初始化,无法发送消息')
|
|
|
|
|
|
return
|
2026-01-05 14:29:33 +08:00
|
|
|
|
}
|
2026-01-15 17:37:57 +08:00
|
|
|
|
|
|
|
|
|
|
// uni-app 的 socketTask.send 使用对象形式
|
|
|
|
|
|
socket.send({
|
|
|
|
|
|
data: JSON.stringify(data),
|
|
|
|
|
|
fail(err) {
|
|
|
|
|
|
console.error('发送 WebSocket 消息失败:', err)
|
|
|
|
|
|
}
|
|
|
|
|
|
})
|
2026-01-05 14:29:33 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return { connect, close, send }
|
|
|
|
|
|
}
|
|
|
|
|
|
|