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

327 lines
7.4 KiB
JavaScript

6 months ago
class Bluetooth {
constructor() {
this.isOpenBle = false;
this.deviceId = "";
this.serviceId = "";
this.writeId = "";
this.notifyId = "";
this.initBluetooth();
}
showToast(title) {
uni.showToast({
title: title,
icon: 'none',
'duration': 2000
});
}
initBluetooth () {
return new Promise((resolve, reject) => {
uni.openBluetoothAdapter({
success: res => {
this.isOpenBle = true;
// this.showToast("初始化蓝牙模块成功");
console.log("初始化蓝牙模块成功")
resolve(res);
},
fail: err => {
if (err.code == 10001 ) {
this.showToast('请先打开蓝牙')
} else {
// this.showToast(`初始化蓝牙模块失败` + JSON.stringify(err));
console.log(`初始化蓝牙模块失败` + JSON.stringify(err))
}
reject(err);
},
});
});
}
startBluetoothDevicesDiscovery(options) {
if (!this.isOpenBle) {
this.showToast(`初始化蓝牙模块失败`)
return;
}
const { uuids = [], isListen, callback } = options
let self = this;
const devices = [];
isListen && uni.onBluetoothDeviceFound(res => {
const newDevice = res.devices[0]
if (!newDevice.name) {
return false;
}
const isExist = devices.some(item => item.deviceId == newDevice.deviceId)
!isExist && devices.push(newDevice)
setTimeout(() => {
callback && callback(devices)
}, 1500)
})
return new Promise((resolve, reject) => {
setTimeout(() => {
uni.startBluetoothDevicesDiscovery({
services: uuids,
allowDuplicatesKey: false,
interval: 1000,
success: res => {
resolve(res)
},
fail: res => {
self.showToast(`搜索设备失败` + JSON.stringify(err));
reject(err);
},
complete: (e) => {
}
})
}, 300);
});
}
stopBluetoothDevicesDiscovery() {
let self = this;
return new Promise((resolve, reject) => {
uni.stopBluetoothDevicesDiscovery({
success: e => {
console.log('搜索已停止')
},
fail: e => {
uni.hideLoading();
self.showToast(`停止搜索蓝牙设备失败` + JSON.stringify(err));
}
})
});
}
createBLEConnection(deviceId) {
//设备deviceId
this.deviceId = deviceId;
let self = this;
uni.showLoading({
mask: true,
title: '设别连接中...'
})
console.log(this.deviceId);
return new Promise((resolve, reject) => {
uni.createBLEConnection({
deviceId,
success: (res) => {
console.log("res:createBLEConnection " + JSON.stringify(res));
resolve(res)
},
fail: err => {
self.showToast(`连接失败` + JSON.stringify(err));
this.showToast('连接失败')
reject(err);
},
complete() {
uni.hideLoading();
}
})
});
}
// 获取已发现的蓝牙设备
getBLEDevices () {
return new Promise((resolve, rejcet) => {
uni.getBluetoothDevices({
success(res) {
resolve(res)
},
fail(error) {
reject(error)
}
})
})
}
// 根据 uuid 获取处于已连接状态的设备
getConnectedBluetoothDevices (uuids) {
return new Promise((resolve, reject) => {
uni.getConnectedBluetoothDevices({
services: uuids,
success: (res) => {
resolve(res)
},
fail: (error) => {
reject(error)
}
})
})
}
//获取蓝牙设备所有服务(service)
getBLEDeviceServices() {
let _serviceList = [];
let deviceId = this.deviceId;
let self = this;
return new Promise((resolve, reject) => {
uni.getBLEDeviceServices({
deviceId,
success: res => {
console.log('before details services:', res.services )
for (let service of res.services) {
if (service.isPrimary) {
_serviceList.push(service);
}
}
uni.hideLoading();
console.log("_serviceList: " + JSON.stringify(_serviceList));
resolve(_serviceList)
},
fail: err => {
uni.hideLoading();
self.showToast(`获取设备Services` + JSON.stringify(err));
reject(err);
},
})
});
}
//获取蓝牙设备某个服务中所有特征值(characteristic)
getBLEDeviceCharacteristics(serviceId) {
let deviceId = this.deviceId;
this.serviceId = serviceId;
let self = this;
return new Promise((resolve, reject) => {
uni.getBLEDeviceCharacteristics({
deviceId,
serviceId,
success: res => {
for (let _obj of res.characteristics) {
//获取notify
if (_obj.properties.notify) {
self.notifyId = _obj.uuid;
uni.setStorageSync('notifyId', self.notifyId);
}
//获取writeId
if (_obj.properties.write) {
self.writeId = _obj.uuid;
uni.setStorageSync('writeId', self.writeId);
}
}
//console.log("res:getBLEDeviceCharacteristics " + JSON.stringify(res));
let result = {
'notifyId': self.notifyId,
'writeId': self.writeId
};
// self.showToast(`获取服务中所有特征值OK,${JSON.stringify(result)}`);
resolve(result)
},
fail: err => {
self.showToast(`getBLEDeviceCharacteristics` + JSON.stringify(err));
reject(err);
}
})
});
}
//断开联链接
closeBLEConnection() {
let deviceId = this.deviceId;
console.log(deviceId);
uni.closeBLEConnection({
deviceId,
success(res) {
console.log(res)
},
fail(error) {
console.log('断开连接失败:', error)
}
})
}
notifyBLECharacteristicValue() {
let deviceId = this.deviceId;
let serviceId = this.serviceId;
let characteristicId = this.notifyId;
uni.notifyBLECharacteristicValueChange({
state: true, // 启用 notify 功能
deviceId,
serviceId,
characteristicId,
success(res) {
uni.onBLECharacteristicValueChange(function(res) {
});
},
fail(res) {
console.log('notifyBLECharacteristicValueChange failed:' + res.errMsg);
}
});
}
writeBLECharacteristicValue(buffer, characteristicId) {
let deviceId = this.deviceId;
let serviceId = this.serviceId;
// let characteristicId = this.writeId;
this.characteristicId = characteristicId;
console.log("this: " + JSON.stringify(this));
return new Promise((resolve, reject) => {
uni.writeBLECharacteristicValue({
deviceId,
serviceId,
characteristicId,
value: buffer,
// writeType: "writeNoResponse"
success(res) {
console.log('message发送成功', JSON.stringify(res));
resolve(res);
},
fail(err) {
console.log('message发送失败', JSON.stringify(err));
reject(err);
}
});
});
}
closeBluetoothAdapter() {
uni.closeBluetoothAdapter({
success: res => {
console.log(res)
}
});
}
//若APP在之前已有搜索过某个蓝牙设备并成功建立连接可直接传入之前搜索获取的 deviceId 直接尝试连接该设备,无需进行搜索操作。
reconnect() {
(async () => {
try {
this.deviceId = this.deviceId || uni.getStorageSync("deviceId");
this.serviceId = this.serviceId || uni.getStorageSync("serviceId");
let result1 = await this.createBLEConnection();
console.log("createBLEConnection: " + JSON.stringify(result1));
let result2 = await this.getBLEDeviceServices();
console.log("getBLEDeviceServices: " + JSON.stringify(result2));
let result3 = await this.getBLEDeviceCharacteristics();
console.log("getBLEDeviceCharacteristics: " + JSON.stringify(result3));
// this.writeId = uni.getStorageSync("writeId");
// this.notifyId = uni.getStorageSync("notifyId");
} catch (err) {
console.log("err: " + JSON.stringify(err));
}
})();
}
}
export default Bluetooth;