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.

163 lines
3.0 KiB

let wsurl = "";
let accessToken = "";
let openCallBack = null;
2 years ago
let messageCallBack = null;
let closeCallBack = null;
let isConnect = false; //连接标识 避免重复连接
let hasInit = false;
2 years ago
let init = (url, token) => {
wsurl = url;
accessToken = token;
2 years ago
// 防止重新注册事件
if(hasInit){
return;
}
hasInit = true;
2 years ago
uni.onSocketOpen((res) => {
console.log("WebSocket连接已打开");
isConnect = true;
// 发送登录命令
let loginInfo = {
cmd: 0,
data: {
accessToken: accessToken
}
};
uni.sendSocketMessage({
data: JSON.stringify(loginInfo)
});
})
2 years ago
uni.onSocketMessage((res) => {
let sendInfo = JSON.parse(res.data)
if (sendInfo.cmd == 0) {
heartCheck.start()
console.log('WebSocket登录成功')
// 登录成功才算连接完成
openCallBack && openCallBack();
} else if (sendInfo.cmd == 1) {
// 重新开启心跳定时
heartCheck.reset();
} else {
// 其他消息转发出去
console.log("接收到消息",sendInfo);
messageCallBack && messageCallBack(sendInfo.cmd, sendInfo.data)
}
})
2 years ago
uni.onSocketClose((res) => {
console.log(res)
console.log('WebSocket连接关闭')
isConnect = false; //断开后修改标识
2 years ago
closeCallBack && closeCallBack(res);
})
2 years ago
uni.onSocketError((e) => {
console.log(e)
isConnect = false; //连接断开修改标识
uni.showModal({
content: '连接失败,可能是websocket服务不可用,请稍后再试',
showCancel: false,
})
})
};
2 years ago
let connect = ()=>{
if (isConnect) {
return;
}
uni.connectSocket({
url: wsurl,
success: (res) => {
console.log("websocket连接成功");
},
fail: (e) => {
console.log(e);
console.log("websocket连接失败,10s后重连");
setTimeout(()=>{
connect();
},10000)
}
2 years ago
});
}
2 years ago
//设置关闭连接
let close = () => {
if (!isConnect) {
return;
}
uni.closeSocket({
code: 3000,
complete: (res) => {
console.log("关闭websocket连接");
isConnect = false;
},
fail:(e)=>{
console.log("关闭websocket连接失败",e);
}
});
};
//心跳设置
var heartCheck = {
timeout: 10000, //每段时间发送一次心跳包 这里设置为30s
timeoutObj: null, //延时发送消息对象(启动心跳新建这个对象,收到消息后重置对象)
start: function() {
if (isConnect) {
console.log('发送WebSocket心跳')
let heartBeat = {
cmd: 1,
data: {}
};
uni.sendSocketMessage({
data: JSON.stringify(heartBeat),
fail(res) {
console.log(res);
}
})
}
},
reset: function() {
clearTimeout(this.timeoutObj);
this.timeoutObj = setTimeout(function() {
heartCheck.start();
}, this.timeout);
}
}
// 实际调用的方法
function sendMessage(agentData) {
uni.sendSocketMessage({
data: agentData
})
}
2 years ago
function onMessage(callback) {
messageCallBack = callback;
}
2 years ago
function onOpen(callback) {
openCallBack = callback;
2 years ago
}
function onClose(callback) {
closeCallBack = callback;
}
// 将方法暴露出去
export {
2 years ago
init,
connect,
close,
sendMessage,
2 years ago
onMessage,
onOpen,
onClose
}