You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

249 lines
6.3 KiB

2 months ago
import config from '@/config'
import { getuserId } from '@/utils/auth'
import { createAlarm } from '@/components/nativeMsg.js';
// import { getXT } from '@/minix/MyRingTone.js'
//导入链接
const socketData = {
state: {
xintiao: 0, //心跳用来测试的时候判断websocket是否正常
// userId: getuserId(), //用户id
socketTast: null, //socket实例
websocketData: {}, // 存放从后端接收到的websocket数据
webSocketPingTimer: null, // 心跳定时器
webSocketPingTime: 10000, // 心跳的间隔,当前为 10秒,
webSocketReconnectCount: 0, // 重连次数
webSocketIsReconnect: true, // 是否重连
webSocketIsOpen: true, //链接是否在打开
},
mutations: {
setXinTiao(state, data) {
state.xintiao = state.xintiao + data
},
setsockTast(state, data) {
state.socketTast = data
},
setWebsocketData(state, data) {
state.websocketData = data
},
setChonglian(state, data) {
state.webSocketReconnectCount = state.webSocketReconnectCount + data
},
setIsOpen(state, data) {
state.webSocketIsOpen = data
},
},
actions: {
//链接打开
websocketOnOpen({ dispatch, commit }) {
console.log('WebSocket连接正常打开中...')
//开始心跳检测
dispatch('webSocketPing')
commit('setIsOpen', true)
},
// 定时心跳告诉服务器自己还活着,防止丢包
webSocketPing({ state, dispatch, commit }) {
if (getuserId()) {
state.webSocketPingTimer = setTimeout(() => {
//链接关闭就结束心跳
if (!state.webSocketIsOpen) {
return false;
}
console.log("心跳");
commit('setXinTiao', 1)
const payload = 1
dispatch('websocketSend', JSON.stringify(payload));
clearTimeout(state.webSocketPingTimer);
// 重新执行
dispatch('webSocketPing');
}, state.webSocketPingTime);
}
},
websocketInit({ state, dispatch, commit }, ) {
if (getuserId()) {
console.log(`${config.WebSocketBaseUrl}/${getuserId()}`);
let socketTast = uni.connectSocket({
// url, // url是websocket连接ip
url: `${config.WebSocketBaseUrl}/${getuserId()}`,
success: () => {
// uni.showToast({
// title: 'websocketInit',
// icon: 'none'
// });
// console.log('websocket连接成功')
},
fail: e => {
console.log(e)
}
})
commit('setsockTast', socketTast)
//检测链接打开
state.socketTast.onOpen(() => dispatch('websocketOnOpen'))
//接收服务器消息
state.socketTast.onMessage(res => dispatch('websocketOnMessage', res))
// 链接关闭事件
state.socketTast.onClose(e => dispatch('websocketOnClose'))
//链接错误
state.socketTast.onError(e => dispatch('websocketOnError'))
}
},
// 断开连接时
webSocketClose({ state, dispatch, commit }) {
if (getuserId()) {
// 修改状态为未连接
commit('setIsOpen', false)
// state.webSocketIsOpen = false;
// state.webSocket = null;
// // 判断是否重连
if (
state.webSocketIsReconnect &&
state.webSocketReconnectCount === 0
) {
// console.log("正在尝试重连");
// 第一次直接尝试重连
dispatch('webSocketReconnect');
}
}
},
// WebSocket 重连
webSocketReconnect({ state, dispatch, commit }) {
if (getuserId()) {
if (state.webSocketIsOpen) {
return false;
}
console.log("第" + state.webSocketReconnectCount + "次重连")
commit('setChonglian', 1)
// 判断是否到了最大重连次数
// 初始化
console.log("开始重连")
dispatch('websocketInit');
uni.showToast({
title: `${state.webSocketReconnectCount}次重连`,
icon: 'none'
});
// 每过 5 秒尝试一次,检查是否连接成功,直到超过最大重连次数
let timer = setTimeout(() => {
dispatch('webSocketReconnect');
clearTimeout(timer);
}, 5000);
}
},
// 收到数据
websocketOnMessage({ commit }, res) {
// 修改状态为未连接
//接到推送的消息--显示全局弹窗
if (res.data !== 'sssss' && res.data !== '连接成功') {
// #ifdef APP-VUE
uni.createPushMessage({
title: "任务提醒",
sound: "system",
content: JSON.parse(res.data).messageContent,
success(res) {
console.log('推送成功', res)
},
fail(err) {
console.log('推送失败', err)
}
})
// getXT('您有一条推送消息')
//内部悬浮弹窗
let alarmId = Date.now();
let msg = {
alarmId: alarmId,
warningTypeStr: '任务提示',
projectName: '2023年5月17日',
description: JSON.parse(res.data).messageContent
};
let alarmIns = createAlarm(msg, res => {
const { type, result } = res;
//监听点击事件
if (type === 'click') {
uni.showToast({
title: '点击了',
icon: 'none'
});
}
uni.showToast({
title: `${type === 'click' ? '点击了' : '上滑了'}`,
icon: 'none'
});
});
// #endif
// #ifdef H5
//弹窗
this._vm.$openInvite(JSON.parse(res.data).messageContent)
// #endif
}
console.log('收到服务器内容:' + res.data.toString().slice(1, 11))
if (res.data !== '连接成功') {
commit('setWebsocketData', (res.data || null))
}
},
//链接关闭
websocketOnClose({ commit, dispatch }) {
//链接关闭执行
dispatch('webSocketClose')
uni.showToast({
title: 'websocketOnError连接关闭',
icon: 'none'
});
console.log('websocketOnClose连接关闭')
},
//连接错误
websocketOnError({ commit, dispatch }) {
//链接关闭执行
dispatch('webSocketClose')
uni.showToast({
title: 'websocketOnError连接错误',
icon: 'none'
});
console.log('websocketOnError连接错误')
},
//关闭websocket
websocketCloseGuanBi({ state }) {
if (!state.socketTast) return
state.socketTast.close({
success(res) {
console.log('关闭成功', res)
},
fail(err) {
console.log('关闭失败', err)
}
})
},
// 发送数据
websocketSend({ state, dispatch }, data) {
state.socketTast.send({
data,
success: res => {
console.log('发送成功', res)
},
fail: e => {
console.log('发送失败', e)
dispatch('webSocketClose')
uni.showToast({
title: '发送失败',
icon: 'none'
});
}
})
}
}
}
export default socketData