190 lines
4.5 KiB
JavaScript
190 lines
4.5 KiB
JavaScript
import {
|
||
websocketStore
|
||
} from '../../pinia/webSocket.js'
|
||
import {
|
||
getBaseUrl
|
||
} from '../../api/requets'
|
||
|
||
export class WebsocketUtil {
|
||
constructor(url, time) {
|
||
this.is_open_socket = false; // 避免重复连接
|
||
this.url = url; // 地址
|
||
this.timeout = time; // 心跳检测时间间隔
|
||
this.heartbeatInterval = null; // 心跳检测定时器
|
||
this.reconnectTimeOut = null; // 重连定时器
|
||
try {
|
||
// if (isMerchantLoggedInLocally()) {
|
||
if (!this.is_open_socket) {
|
||
this.connectSocketInit();
|
||
}
|
||
// }
|
||
} catch (e) {
|
||
console.log('连接失败', e);
|
||
this.is_open_socket = false;
|
||
this.reconnect();
|
||
}
|
||
}
|
||
// 创建 WebSocket 连接
|
||
connectSocketInit() {
|
||
this.socketTask = uni.connectSocket({
|
||
url: this.url,
|
||
success: (res) => {
|
||
console.log(res)
|
||
}
|
||
});
|
||
this.socketTask.onOpen((res) => {
|
||
console.log("WebSocket连接正常!");
|
||
clearTimeout(this.reconnectTimeOut);
|
||
clearTimeout(this.heartbeatInterval);
|
||
this.is_open_socket = true;
|
||
this.start();
|
||
setTimeout(async () => {
|
||
await this.Close()
|
||
}, 120000)
|
||
this.getMessage((res) => {});
|
||
});
|
||
this.socketTask.onClose(async () => {
|
||
await this.reconnect();
|
||
})
|
||
}
|
||
|
||
// 主动关闭websocket
|
||
Close() {
|
||
if (!this.is_open_socket) {
|
||
return
|
||
}
|
||
this.is_open_socket = false
|
||
this.socketTask.close({
|
||
success() {
|
||
console.log('websocket已经关闭')
|
||
}
|
||
});
|
||
}
|
||
|
||
// 开启心跳检测(可用于维持连接,不发送具体消息)
|
||
start() {
|
||
this.heartbeatInterval = setInterval(() => {
|
||
console.log("心跳检测");
|
||
this.send()
|
||
this.getConnectedBluetooth()
|
||
// 这里可以保留心跳逻辑,但不发送具体消息
|
||
}, this.timeout);
|
||
}
|
||
getConnectedBluetooth() {
|
||
let that = this
|
||
let arr = [uni.getStorageSync('characteristicId')]
|
||
uni.getConnectedBluetoothDevices({
|
||
services: arr,
|
||
fail(res) {
|
||
uni.openBluetoothAdapter({
|
||
success(res) {
|
||
uni.createBLEConnection({
|
||
deviceId: uni.getStorageSync('deviceId'),
|
||
success: res => {
|
||
setTimeout(() => {
|
||
uni.getBLEDeviceServices({
|
||
deviceId: uni.getStorageSync(
|
||
'deviceId'),
|
||
success: res => {
|
||
for (let i = 0; i < res
|
||
.services
|
||
.length; i++) {
|
||
let serviceId = res
|
||
.services[i]
|
||
.uuid
|
||
that.getBLEDeviceCharacteristics(
|
||
uni
|
||
.getStorageSync(
|
||
'deviceId'
|
||
),
|
||
serviceId);
|
||
}
|
||
}
|
||
})
|
||
}, 1000)
|
||
}
|
||
})
|
||
},
|
||
fail(error) {
|
||
uni.showToast({
|
||
title: '请打开蓝牙',
|
||
icon: 'error'
|
||
})
|
||
}
|
||
})
|
||
}
|
||
})
|
||
}
|
||
|
||
/*
|
||
获取蓝牙设备某个服务中所有特征值(characteristic)
|
||
characteristic:
|
||
uuid:蓝牙设备特征值的 uuid
|
||
properties:该特征值支持的操作类型
|
||
*/
|
||
getBLEDeviceCharacteristics(deviceId, serviceId) {
|
||
console.log(1)
|
||
uni.getBLEDeviceCharacteristics({
|
||
// 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
|
||
deviceId: deviceId,
|
||
serviceId,
|
||
success: (res) => {
|
||
console.log(2)
|
||
let result = JSON.parse(JSON.stringify(res))
|
||
for (let i = 0; i < result.characteristics.length; i++) {
|
||
if (result.characteristics[i].properties.write == true) {
|
||
let uuid = result.characteristics[i].uuid
|
||
uni.setStorageSync('serviceId', serviceId)
|
||
uni.setStorageSync('characteristicId', uuid)
|
||
console.log(uni.getStorageSync('serviceId'))
|
||
console.log(uni.getStorageSync('characteristicId'))
|
||
break
|
||
}
|
||
}
|
||
}
|
||
})
|
||
}
|
||
|
||
|
||
send() {
|
||
let userId = uni.getStorageSync('userInfo')?.userId
|
||
var messageVO = {
|
||
"type": 1,
|
||
"userId": userId,
|
||
"toUserId": userId,
|
||
"content": "ok"
|
||
}
|
||
this.socketTask.send({
|
||
data: JSON.stringify(messageVO),
|
||
success: (res) => {
|
||
console.log('已发送')
|
||
}
|
||
});
|
||
}
|
||
|
||
// 重连逻辑
|
||
reconnect() {
|
||
clearInterval(this.heartbeatInterval);
|
||
clearTimeout(this.reconnectTimeOut);
|
||
console.log('监听到关闭了')
|
||
if (!this.is_open_socket) {
|
||
this.reconnectTimeOut = setTimeout(() => {
|
||
console.log('已重连websocket')
|
||
this.connectSocketInit();
|
||
}, 300);
|
||
}
|
||
}
|
||
|
||
// 外部获取消息
|
||
getMessage(callback) {
|
||
console.log('小猫老弟');
|
||
this.socketTask.onMessage((res) => {
|
||
let websocket = websocketStore();
|
||
let obj = JSON.parse(res.data);
|
||
console.log(obj.content, '你好');
|
||
console.log(obj)
|
||
websocket.getMyOrders(obj.content);
|
||
return callback(res);
|
||
});
|
||
}
|
||
} |