蓝牙增加断开重连、换设备后可以去再次绑定
This commit is contained in:
@ -1,5 +1,18 @@
|
||||
import receivTool from "@/utils/BleReceive.js"
|
||||
var recei = null;
|
||||
const serviceDic = [ //合作供应商的蓝牙主服务
|
||||
{
|
||||
"serviceId": "0000AE30-0000-1000-8000-00805F9B34FB",
|
||||
"writeId": "0000AE03-0000-1000-8000-00805F9B34FB",
|
||||
"notifyId": "0000AE02-0000-1000-8000-00805F9B34FB"
|
||||
},
|
||||
{
|
||||
"serviceId": "0000FFE0-0000-1000-8000-00805F9B34FB",
|
||||
"writeId": "0000FFE1-0000-1000-8000-00805F9B34FB",
|
||||
"notifyId": "0000FFE2-0000-1000-8000-00805F9B34FB"
|
||||
}
|
||||
];
|
||||
|
||||
class BleHelper {
|
||||
constructor() {
|
||||
this.StorageKey = "linkedDevices";
|
||||
@ -130,7 +143,7 @@ class BleHelper {
|
||||
}
|
||||
|
||||
updateCache() {
|
||||
console.log("this.StorageKey=", this.StorageKey)
|
||||
// console.log("this.StorageKey=", this.StorageKey)
|
||||
uni.setStorageSync(this.StorageKey, this.data.LinkedList);
|
||||
}
|
||||
|
||||
@ -414,18 +427,18 @@ class BleHelper {
|
||||
}
|
||||
|
||||
uni.onBluetoothAdapterStateChange((state) => {
|
||||
console.log('蓝牙状态发生变化:' + JSON.stringify(state));
|
||||
if(this.data.available==state.available){
|
||||
return;
|
||||
}
|
||||
this.data.available = state.available;
|
||||
this.data.discovering = state.discovering;
|
||||
if (this.data.available && this.data
|
||||
.isOpenBlue) { //蓝牙状态再次可用,重连所有设备
|
||||
this.linkAllDevices();
|
||||
// console.log('蓝牙状态发生变化:' + JSON.stringify(state));
|
||||
if (this.data.available !== state.available) {
|
||||
this.data.available = state.available;
|
||||
this.data.discovering = state.discovering;
|
||||
if (this.data.available && this.data
|
||||
.isOpenBlue) { //蓝牙状态再次可用,重连所有设备
|
||||
this.linkAllDevices();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (!state.available) { //蓝牙状态不可用了,将所有设备标记为断开连接
|
||||
this.data.LinkedList.filter((v) => {
|
||||
v.Linked = false;
|
||||
@ -442,7 +455,7 @@ class BleHelper {
|
||||
if (!res.connected) {
|
||||
|
||||
console.log("蓝牙连接已断开", res);
|
||||
this.data.LinkedList.find((v) => {
|
||||
let f=this.data.LinkedList.find((v) => {
|
||||
if (v.deviceId == res.deviceId) {
|
||||
v.Linked = false;
|
||||
v.notifyState = false;
|
||||
@ -451,13 +464,15 @@ class BleHelper {
|
||||
return false;
|
||||
});
|
||||
this.updateCache();
|
||||
console.log("尝试5次恢复连接");
|
||||
this.LinkBlue(res.deviceId,f.writeServiceId,f.wirteCharactId,f.notifyCharactId,5)
|
||||
} else {
|
||||
// console.log("蓝牙连接已恢复,", res);
|
||||
console.log("蓝牙连接已恢复,", res);
|
||||
}
|
||||
});
|
||||
|
||||
uni.onBluetoothDeviceFound((devices) => {
|
||||
// ////console.log("发现新设备:" + JSON.stringify(devices));
|
||||
// console.log("发现新设备:" + JSON.stringify(devices));
|
||||
this.data.searchList = this.data.searchList.concat(
|
||||
devices);
|
||||
if (this.cfg.onDeviceFound) {
|
||||
@ -556,16 +571,18 @@ class BleHelper {
|
||||
console.log("有人订阅消息")
|
||||
this.cfg.receivDataCallback.forEach((
|
||||
rec) => {
|
||||
console.log("有人订阅消息111",)
|
||||
console.log("有人订阅消息111", )
|
||||
if (rec.callback) {
|
||||
try{
|
||||
rec.callback(recData, f,
|
||||
path, this.cfg
|
||||
.receivDataCallback);
|
||||
}catch(err){
|
||||
console.log("订阅消息出现异常",err);
|
||||
try {
|
||||
rec.callback(recData, f,
|
||||
path, this.cfg
|
||||
.receivDataCallback
|
||||
);
|
||||
} catch (err) {
|
||||
console.log("订阅消息出现异常",
|
||||
err);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
})
|
||||
} else {
|
||||
@ -643,22 +660,42 @@ class BleHelper {
|
||||
var these = this;
|
||||
//开始搜索
|
||||
var Search = () => {
|
||||
console.log("Search........");
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.startBluetoothDevicesDiscovery({
|
||||
services: [],
|
||||
allowDuplicatesKey: false,
|
||||
success: (res) => {
|
||||
//console.log('开始搜索蓝牙设备成功');
|
||||
resolve(res);
|
||||
//只搜索合作供应商的服务id
|
||||
let serviceIds = serviceDic.map(v => {
|
||||
return v.serviceId
|
||||
});
|
||||
|
||||
},
|
||||
fail: (err) => {
|
||||
console.log(`搜索蓝牙设备失败:`, err);
|
||||
//搜索一个服务id的设备,循环调用
|
||||
let RunSearch = (serviceId) => {
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.startBluetoothDevicesDiscovery({
|
||||
services: [serviceId],
|
||||
allowDuplicatesKey: false,
|
||||
success: (res) => {
|
||||
//console.log('开始搜索蓝牙设备成功');
|
||||
resolve(res);
|
||||
|
||||
reject(this.getError(err));
|
||||
}
|
||||
},
|
||||
fail: (err) => {
|
||||
console.log(`搜索蓝牙设备失败:`, err);
|
||||
|
||||
reject(this.getError(err));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
let promises = [];
|
||||
for (let i = 0; i < serviceIds.length; i++) {
|
||||
|
||||
promises.push(RunSearch(serviceIds[i]));
|
||||
}
|
||||
|
||||
Promise.all(promises).then(resolve).catch(reject);
|
||||
|
||||
});
|
||||
|
||||
|
||||
@ -667,13 +704,15 @@ class BleHelper {
|
||||
|
||||
|
||||
return this.OpenBlue().then((res) => {
|
||||
console.log("蓝牙适配器状态", res)
|
||||
// console.log("蓝牙适配器状态", res)
|
||||
|
||||
return Search();
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
//停止搜索
|
||||
StopSearch() {
|
||||
return new Promise((resolve, reject) => {
|
||||
@ -717,21 +756,24 @@ class BleHelper {
|
||||
|
||||
//订阅消息
|
||||
subScribe(deviceId, state) {
|
||||
console.log("开始订阅消息");
|
||||
return new Promise((resolve, reject) => {
|
||||
setTimeout(() => {
|
||||
|
||||
let c = this.data.LinkedList.find((v) => {
|
||||
return v.deviceId == deviceId;
|
||||
});
|
||||
|
||||
if (state) {
|
||||
if (c.notifyState) {
|
||||
resolve();
|
||||
return;
|
||||
}
|
||||
}
|
||||
// console.log("c=", c);
|
||||
|
||||
let startSubScribe = (id, serviceId, characteristicId) => {
|
||||
// console.log("serviceId=", serviceId);
|
||||
// console.log("characteristicId=", characteristicId);
|
||||
console.log("serviceId=", serviceId);
|
||||
console.log("characteristicId=", characteristicId);
|
||||
let p1 = new Promise((succ, err) => {
|
||||
|
||||
uni.notifyBLECharacteristicValueChange({
|
||||
@ -790,33 +832,36 @@ class BleHelper {
|
||||
|
||||
if (item.properties.notify) {
|
||||
promies.push(startSubScribe(deviceId, serviceId, characteristicId));
|
||||
|
||||
}
|
||||
}
|
||||
}else{
|
||||
promies.push(startSubScribe(c.deviceId, c.notifyServiceid, c.notifyCharactId));
|
||||
}
|
||||
|
||||
if (promies.length > 0) {
|
||||
|
||||
// console.log("234324324324");
|
||||
|
||||
Promise.allSettled(promies).then((results) => {
|
||||
// console.log("11111");
|
||||
|
||||
results.forEach((result, index) => {
|
||||
if (result.status === "fulfilled") {
|
||||
// console.log(`操作${index + 1}成功:`, result.value);
|
||||
// console.log(`操作${index + 1}成功:`, result.value);
|
||||
} else {
|
||||
// console.log(`操作${index + 1}失败:`, result.reason
|
||||
// .message);
|
||||
// console.log(`操作${index + 1}失败:`, result.reason
|
||||
// .message);
|
||||
}
|
||||
});
|
||||
|
||||
// console.log("订阅消息成功");
|
||||
resolve();
|
||||
}).catch((ex) => {
|
||||
// console.log("222222");
|
||||
console.log("ex=",ex);
|
||||
reject(ex);
|
||||
}).finally(() => {
|
||||
// console.log("finally")
|
||||
});
|
||||
} else {
|
||||
// console.log("33333");
|
||||
console.log("没有特征需要订阅");
|
||||
resolve();
|
||||
}
|
||||
|
||||
@ -848,16 +893,44 @@ class BleHelper {
|
||||
v.services = res.services;
|
||||
}
|
||||
});
|
||||
this.updateCache();
|
||||
//this.updateCache();
|
||||
|
||||
var promises = [];
|
||||
let s = null;
|
||||
let se = res.services.find((v) => {
|
||||
return v.uuid.indexOf(targetServiceId) > -1;
|
||||
|
||||
s = serviceDic.find(k => {
|
||||
|
||||
return k.serviceId == v.uuid;
|
||||
})
|
||||
if (s) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
// return v.uuid.indexOf(targetServiceId) > -1;
|
||||
});
|
||||
|
||||
if (se) {
|
||||
promises.push(this.getFeatrus(id, se.uuid, writeCharId,
|
||||
notifyCharId));
|
||||
console.log("合作供应商的",s)
|
||||
this.data.LinkedList.find((v) => {
|
||||
if (v.deviceId == id) {
|
||||
v.writeServiceId = s.serviceId;
|
||||
v.wirteCharactId = s.writeId;
|
||||
v.notifyServiceid = s.serviceId;
|
||||
v.notifyCharactId = s.notifyId;
|
||||
}
|
||||
});
|
||||
this.updateCache();
|
||||
|
||||
//合作供应商的设备,直接订阅消息,不走发现特征了
|
||||
promises.push(this.subScribe(id, true));
|
||||
|
||||
// promises.push(this.getFeatrus(id, se.uuid, writeCharId,
|
||||
// notifyCharId));
|
||||
|
||||
|
||||
} else {
|
||||
console.log("预设的蓝牙服务和特征中找不到");
|
||||
for (var i = 0; i < res.services.length; i++) {
|
||||
let service = res.services[i];
|
||||
promises.push(this.getFeatrus(id, service.uuid,
|
||||
@ -876,13 +949,19 @@ class BleHelper {
|
||||
|
||||
Promise.all(promises)
|
||||
.then(results => {
|
||||
if (!s) {
|
||||
//非指定供应商的设备,走订阅消息
|
||||
return this.subScribe(id, true);
|
||||
} else {
|
||||
//指定供应商的设备已经订阅过了
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
return this.subScribe(id, true);
|
||||
})
|
||||
.then((res) => {
|
||||
console.log('设备连接成功,初始化完成', res);
|
||||
console.log("LinkedList=", this.data
|
||||
console.log('设备连接成功,初始化完成', this.data
|
||||
.LinkedList);
|
||||
|
||||
resolve();
|
||||
})
|
||||
.catch(error => {
|
||||
@ -928,28 +1007,47 @@ class BleHelper {
|
||||
deviceId: id,
|
||||
serviceId: serviceId,
|
||||
success: (res) => {
|
||||
|
||||
console.log("获取到特征:" + JSON.stringify(res));
|
||||
res.characteristics.forEach((v) => {
|
||||
v.serviceId = serviceId;
|
||||
});
|
||||
// res.characteristics.forEach((v) => {
|
||||
// v.serviceId = serviceId;
|
||||
// });
|
||||
|
||||
//写特征
|
||||
let writeChar = res.characteristics.find(char => {
|
||||
return char.uuid.indexOf(writeCharId) > -1
|
||||
let fe = serviceDic.find(v => {
|
||||
return v.serviceId == serviceId && v.writeId == char
|
||||
.uuid;
|
||||
})
|
||||
// return char.uuid.indexOf(writeCharId) > -1
|
||||
if (fe) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
});
|
||||
if (!writeChar) {
|
||||
writeChar = res.characteristics.find(char => {
|
||||
return char.properties.write;
|
||||
});
|
||||
}
|
||||
// if (!writeChar) {
|
||||
// writeChar = res.characteristics.find(char => {
|
||||
// return char.properties.write;
|
||||
// });
|
||||
// }
|
||||
//通知特征
|
||||
let notiChar = res.characteristics.find(char => {
|
||||
return char.uuid.indexOf(notifyCharId) > -1;
|
||||
let fe = serviceDic.find(v => {
|
||||
return v.serviceId == serviceId && v.notifyId ==
|
||||
char.uuid;
|
||||
})
|
||||
// return char.uuid.indexOf(writeCharId) > -1
|
||||
if (fe) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
// return char.uuid.indexOf(notifyCharId) > -1;
|
||||
});
|
||||
if (!notiChar) {
|
||||
notiChar = res.characteristics.find(char => {
|
||||
return char.properties.notify;
|
||||
});
|
||||
}
|
||||
// if (!notiChar) {
|
||||
// notiChar = res.characteristics.find(char => {
|
||||
// return char.properties.notify;
|
||||
// });
|
||||
// }
|
||||
this.data.LinkedList.find(function(v) {
|
||||
if (v.deviceId == id) {
|
||||
if (!v.Characteristics) {
|
||||
@ -1001,9 +1099,11 @@ class BleHelper {
|
||||
}
|
||||
|
||||
//连接某个设备
|
||||
LinkBlue(deviceId, targetServiceId, writeCharId, notifyCharId) {
|
||||
|
||||
LinkBlue(deviceId, targetServiceId, writeCharId, notifyCharId, maxRetries) {
|
||||
|
||||
if (maxRetries === undefined) {
|
||||
maxRetries = 0; // 最大重试次数
|
||||
}
|
||||
if (!writeCharId) {
|
||||
writeCharId = "xxxx"; // "FFE1";
|
||||
}
|
||||
@ -1030,7 +1130,7 @@ class BleHelper {
|
||||
var linkDevice = () => {
|
||||
// 添加重试次数限制
|
||||
let retryCount = 0;
|
||||
const maxRetries = 5; // 最大重试次数
|
||||
|
||||
|
||||
const connect = () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
@ -1050,7 +1150,7 @@ class BleHelper {
|
||||
console.log("正在连接" + deviceId);
|
||||
uni.createBLEConnection({
|
||||
deviceId: deviceId,
|
||||
timeout: 30000,
|
||||
timeout: 3000,
|
||||
success: (info) => {
|
||||
console.log("新连接成功", this.data.LinkedList);
|
||||
this.getLinkBlue().then((arr) => {
|
||||
@ -1078,8 +1178,7 @@ class BleHelper {
|
||||
deviceId: deviceId,
|
||||
mtu: 512,
|
||||
success: (mtu) => {
|
||||
console.log("mtu设置成功",
|
||||
mtu);
|
||||
|
||||
resolve(true);
|
||||
},
|
||||
fail: () => {
|
||||
@ -1098,7 +1197,7 @@ class BleHelper {
|
||||
},
|
||||
fail: (ex) => {
|
||||
ex = this.getError(ex);
|
||||
console.log("蓝牙"+deviceId+"连接失败" + JSON.stringify(ex));
|
||||
console.log("蓝牙" + deviceId + "连接失败" + JSON.stringify(ex));
|
||||
|
||||
// 连接超时后自动重试
|
||||
if (ex.code === 10012 && retryCount < maxRetries) {
|
||||
|
||||
Reference in New Issue
Block a user