/*
|
* @Description: webSocket相关
|
* @Author: Ben Lin
|
* @version:
|
* @Date: 2024-07-24 20:42:38
|
* @LastEditors: Ben Lin
|
* @LastEditTime: 2024-08-26 16:16:01
|
*/
|
import { defineStore } from 'pinia';
|
import { useGlobSetting } from '/@/hooks/setting';
|
|
const globSetting = useGlobSetting();
|
interface SocketState {
|
// 这里是你的状态
|
socket: WebSocket | null;
|
readyState: number;
|
socketMessage: string;
|
socketHeart: number;
|
socketError: number;
|
heartTime: any;
|
HeartTimeOut: number;
|
printTag: string;
|
printJson: string;
|
}
|
|
export const useWebSocketStore = defineStore({
|
id: 'app-websocket',
|
// 其他配置...
|
state: (): SocketState => ({
|
// 这里是你的状态
|
socket: null as WebSocket | null,
|
readyState: 0,
|
socketMessage: '1',
|
socketHeart: 0,
|
socketError: 0,
|
heartTime: null,
|
HeartTimeOut: 5*60*1000,
|
printTag: '',
|
printJson: ''
|
}),
|
getters: {
|
GetSocket(state) {
|
return state.socket;
|
},
|
GetMessage(state) {
|
return state.socketMessage;
|
},
|
GetSocketState(state) {
|
return state.readyState;
|
},
|
GetPrintTag(state) {
|
return state.printTag;
|
},
|
GetPrintJson(state) {
|
return state.printJson;
|
},
|
},
|
actions: {
|
// 这里是你的 actions
|
connectWebSocket() {
|
const HOST_ADDRESS = globSetting.wsUrl; //'ws://192.167.4.140:7519';
|
this.socket = new WebSocket(HOST_ADDRESS);
|
// 监听连接事件
|
this.socket.onopen = () => {
|
// 启动心跳检测 确保连接存活 客户端每隔5秒向服务端发送一次心跳消息
|
this.readyState = this.socket?.readyState as number;
|
this.resetHeart();
|
};
|
|
// 监听消息事件
|
this.socket.onmessage = (event) => {
|
console.log(event.data, 'event2');
|
const d = JSON.parse(event.data);
|
switch (d.Data) {
|
case 'heartbeat':
|
this.resetHeart();
|
console.log('心跳');
|
break;
|
case 'Content':
|
console.log('WebSocket消息: ', d)
|
// that.SetMessage(message)
|
break
|
case 'PrintJS':
|
const json = JSON.parse(d.Message)
|
this.SetPrintTag(json.Tag);
|
this.SetPrintJson(json.Message);
|
break;
|
case 'printer':
|
// let prints = []
|
// message.Message.map((item) => {
|
// prints.push({
|
// value: item,
|
// name: item
|
// })
|
// })
|
// useOperStore().setPrinters(prints)
|
break
|
default:
|
console.log('WebSocket消息: ', d.Message);
|
this.SetMessage(d.Message);
|
break;
|
}
|
};
|
|
// 监听关闭事件 断线重连
|
this.socket.onclose = (e) => {
|
console.log('断开连接', e);
|
this.readyState = this.socket?.readyState as number;
|
this.reconnect();
|
};
|
|
// 连接错误
|
this.socket.onerror = (event) => {
|
console.log('WebSocket error:', event);
|
this.readyState = this.socket?.readyState as number;
|
this.reconnect();
|
};
|
},
|
|
// 发送消息方法
|
sendMessage(message: string) {
|
this.socket?.send(message);
|
},
|
SetMessage(message: string) {
|
this.socketMessage = message;
|
},
|
SetPrintTag(tag: string) {
|
this.printTag = tag;
|
},
|
SetPrintJson(json: string) {
|
this.printJson = json;
|
},
|
SetSocket(socket: WebSocket) {
|
this.socket = socket;
|
},
|
disconnect() {
|
if (this.socket) {
|
this.socket.close();
|
this.socket = null;
|
}
|
},
|
// socket 重置心跳
|
resetHeart() {
|
this.socketHeart = 0;
|
this.socketError = 0;
|
clearInterval(this.heartTime);
|
this.sendSocketHeart();
|
},
|
// socket心跳发送
|
sendSocketHeart() {
|
console.log(this.socket);
|
this.heartTime = setInterval(() => {
|
// 如果连接正常则发送心跳
|
if (this.socket?.readyState == 1) {
|
// if (socketHeart <= 30) {
|
console.log('心跳发送:', this.socketHeart);
|
this.socket?.send(
|
'wsApply ' +
|
JSON.stringify({
|
Data: 'ping',
|
Message: 'BS端心跳发送',
|
}),
|
);
|
this.socketHeart = this.socketHeart + 1;
|
} else {
|
// 重连
|
this.reconnect();
|
}
|
}, this.HeartTimeOut);
|
},
|
|
// socket重连
|
reconnect() {
|
if (this.socketError <= 200) {
|
clearInterval(this.heartTime);
|
this.connectWebSocket();
|
this.socketError = this.socketError + 1;
|
console.log('socket重连', this.socketError);
|
} else {
|
console.log('重试次数已用完的逻辑', this.socketError);
|
clearInterval(this.heartTime);
|
}
|
},
|
},
|
});
|