Files
klp-mono/apps/hand-factory/utils/socketMeasure.js

155 lines
3.6 KiB
JavaScript
Raw Normal View History

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
2026-01-15 20:18:37 +08:00
// 保存回调函数的引用,允许清空
let callbacks = {
onOpen,
onClose,
onError,
onMessage
}
2026-01-05 14:29:33 +08:00
const wsBase = (config.wsUrl || config.baseUrl || '').replace(/^http/, 'ws')
const url = `${wsBase}/websocket?type=${type}`
console.log(url)
2026-01-05 14:29:33 +08:00
function connect() {
manualClose = false
// 使用 uni.connectSocket 建立连接(部分运行环境可能不支持 WebSocket会直接抛异常
try {
socket = uni.connectSocket({
url,
success() {
console.log('connectSocket 调用成功,等待 onOpen 回调')
},
fail(err) {
console.error('connectSocket 调用失败:', err)
2026-01-15 20:18:37 +08:00
callbacks.onError && callbacks.onError(err)
}
})
} catch (err) {
console.error('connectSocket 执行异常(可能环境不支持 WebSocket:', err)
2026-01-15 20:18:37 +08:00
callbacks.onError && callbacks.onError(err)
return
2026-01-05 14:29:33 +08:00
}
if (!socket) {
console.error('connectSocket 未返回有效 socketTask')
return
2026-01-05 14:29:33 +08:00
}
// 正确的事件注册方式socketTask.onOpen / onMessage / onError / onClose
socket.onOpen((res) => {
console.log('WebSocket 已打开', res)
2026-01-15 20:18:37 +08:00
// 检查回调是否已被清空
if (callbacks && callbacks.onOpen) {
try {
callbacks.onOpen(res)
} catch (e) {
// 忽略回调错误
}
}
})
socket.onMessage((evt) => {
// H5 为 evt.data小程序为 evt.data统一兼容
const data = evt && (evt.data || evt)
2026-01-15 20:18:37 +08:00
// 检查回调是否已被清空
if (callbacks && callbacks.onMessage) {
try {
callbacks.onMessage(data)
} catch (e) {
// 忽略回调错误,可能是组件已销毁
}
}
})
socket.onError((err) => {
console.error('WebSocket 发生错误:', err)
2026-01-15 20:18:37 +08:00
// 检查回调是否已被清空
if (callbacks && callbacks.onError) {
try {
callbacks.onError(err)
} catch (e) {
// 忽略回调错误
}
}
})
2026-01-05 14:29:33 +08:00
socket.onClose((evt) => {
console.log('WebSocket 已关闭', evt)
2026-01-15 20:18:37 +08:00
// 检查回调是否已被清空
if (callbacks && callbacks.onClose) {
try {
callbacks.onClose(evt)
} catch (e) {
// 忽略回调错误
}
}
if (!manualClose && callbacks) {
2026-01-05 14:29:33 +08:00
setTimeout(connect, 3000)
}
})
2026-01-05 14:29:33 +08:00
}
function close() {
manualClose = true
2026-01-15 20:18:37 +08:00
// 清空所有回调,防止在关闭过程中或关闭后触发回调
callbacks = {
onOpen: null,
onClose: null,
onError: null,
onMessage: null
}
2026-01-05 14:29:33 +08:00
if (socket) {
2026-01-15 20:18:37 +08:00
try {
socket.close(1000, 'client close')
} catch (e) {
// ignore
}
2026-01-05 14:29:33 +08:00
socket = null
}
}
function send(data) {
if (!socket) {
console.error('WebSocket 未初始化,无法发送消息')
return
2026-01-05 14:29:33 +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
}
2026-01-15 20:18:37 +08:00
// 清空回调函数的方法
function clearCallbacks() {
callbacks = {
onOpen: null,
onClose: null,
onError: null,
onMessage: null
}
}
return { connect, close, send, clearCallbacks }
2026-01-05 14:29:33 +08:00
}