uni.writeBLECharacteristicValue({
deviceId: device.deviceId, // 蓝牙设备 deviceId
serviceId: device.serviceId, // 蓝牙服务uuid,即第二个uuid
characteristicId: device.characteristicId, // 蓝牙特征值的 (即 writeId)
value: buffer, // 这里的value是ArrayBuffer类型
writeType: writeType, // iOS: write, Android: writeNoResponse
success(res) {
_this.errCount = 0;
console.log("writeBLE指令发送成功", str, JSON.stringify(res));
// DEBUG 设备调试用
if (_this.debug) {
_this.debug += " 发送: " + str;
}
},
fail(err) {
console.log("指令发送失败", str, JSON.stringify(err));
// DEBUG 设备调试用
if (_this.debug) {
_this.debug += "发送失败,重新连接: " + str;
}
// 蓝牙连接断开了,重新连接
console.log("指令发送失败, 重新连接", str, JSON.stringify(err));
_this.reconnect();
});

- 发布:2023-09-15 16:50
- 更新:2025-07-18 17:05
- 阅读:924
产品分类: uniapp/App
PC开发环境操作系统: Mac
PC开发环境操作系统版本号: macOS 10.15
HBuilderX类型: 正式
HBuilderX版本号: 3.7.11
手机系统: iOS
手机系统版本号: iOS 16
手机厂商: 苹果
手机机型: iPhone14
页面类型: vue
vue版本: vue2
打包方式: 云端
项目创建方式: HBuilderX
操作步骤:
预期结果:
能够正常写特征值,正常回调
能够正常写特征值,正常回调
实际结果:
调用 uni.writeBLECharacteristicValue 无回调,程序无法正常运行
调用 uni.writeBLECharacteristicValue 无回调,程序无法正常运行
bug描述:
uniapp iOS APP 蓝牙连接不稳定,特别是 uni.writeBLECharacteristicValue 多次写特征值后无回调,有一定的随机性,有时可以,有时出现问题

距离这个帖子两年了,该问题依旧,我想到个不是很合适又无赖的办法,再写个超时的promise,跟发送数据的用Promise.race做竞争返回-1做为异常,如果出现-1就表示是超时了,还是走resolve。
// 发送数据通用方法
sendData(buffer) {
return new Promise(async (resolve, reject) => {
var promise = new Promise((succ, err) => {
uni.writeBLECharacteristicValue({
deviceId: this.connectedDeviceId,
serviceId: this.serviceId,
characteristicId: this.writeCharacteristicId,
value: buffer,
writeType: plus.os.name == 'iOS' ? 'write' : 'writeNoResponse',
success: () => {
console.log("发送数据成功");
succ();
},
fail: (err) => {
console.log("发送数据失败", err);
err(`发送数据失败: ${err.errMsg}`);
},
complete: function() {
console.log("123456");
}
});
});
if (plus.os.name == 'iOS') {
function timeout(ms) {
return new Promise((_, err) => {
setTimeout(() => {
err({
code: -1,
errMsg: '超时了'
})
}, ms);
});
}
Promise.race([promise, timeout(500)]).then(resolve).catch((ex) => {
console.log("ex=",ex);
if (ex.code == -1) {
resolve();
} else {
reject();
}
}).finally(() => {
console.log("完成了")
});
} else {
promise.then(resolve).catch(reject);
}
});
},
1***@qq.com
同问,后来解决了嘛?
2025-07-18 17:03