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

99 lines
2.3 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 }
}