在IOS上使用uni.writeBLECharacteristicValue写入数据,success、fail、complete是不进入任何一个的。
经我反复测试,失败是会进入fail的和complete的。所以不进入任何回调默认成功。
所以IOS上要加一个超时逻辑,进入超时就算是success.核心代码如下。
封装的sendData函数
let sendBuffer = new Promise(async (resolve, reject) => {
var promise = new Promise((succ, err) => {
uni.writeBLECharacteristicValue({
deviceId: device.deviceId,
serviceId: device.writeServiceId,
characteristicId: device.wirteCharactId,
value: buffer,
success: () => {
console.log("发送数据成功");
succ();
},
fail: (ex) => {
ex=this.getError(ex);
console.log("发送数据失败", ex);
err(ex);
}
});
});
if (plus.os.name == 'iOS') {
function timeOut(ms) {
return new Promise((_, err) => {
setTimeout(() => {
err({
code: -1,
errMsg: '超时了'
})
}, ms);
});
}
Promise.race([timeOut(ms), promise]).then(resolve).catch((ex) => {
console.log("ex=", ex);
if (ex.code == -1) {
resolve();
} else {
reject(ex);
}
}).finally(() => {
//console.log("完成了")
});
} else {
promise.then(resolve).catch(reject);
}
});
return sendBuffer;
还有,频繁调用该方法,会进入fail,此时错误编码是10007,官方文档解释是“当前特征值不支持此操作”,
解决方案是暂停一下再重试,直到成功或提示其他错误。
调用的核心代码:
ble.sendData(f.deviceId, buffer, f.writeServiceId, f
.wirteCharactId, inteval).then(() => {
console.log("发送一段成功,发送下一段");
setTimeout(sendNextVideoPacket, inteval);
}).catch(err => {
if(err.code=='10007'){//遇到这个错误自动重新发送这一段数据
setTimeout(sendNextVideoPacket, inteval);//自动重试,经测试大约一秒钟后会再次成功,所以interval这里可以是1000
}else{
//处理发送失败的逻辑
}
});
3 个评论
要回复文章请先登录或注册
1***@qq.com (作者)
jagger_yu
jagger_yu