uni-app uni.writeBLECharacteristicValue当serviceId或characteristicId不正确时不进入任何回调
uni-app uni.writeBLECharacteristicValue当serviceId或characteristicId不正确时不进入任何回调
| 开发环境 | 版本号 | 项目创建方式 |
|---|---|---|
| Windows | Win11 | HBuilderX |
产品分类:uniapp/App
PC开发环境操作系统:Windows
PC开发环境操作系统版本号:Win11
HBuilderX类型:正式
HBuilderX版本号:4.75
手机系统:Android
手机系统版本号:Android 12
手机厂商:华为
手机机型:安卓
页面类型:vue
vue版本:vue2
打包方式:云端
项目创建方式:HBuilderX
### 示例代码:
```javascript
this.addLog("握手成功,正在发送");
uni.writeBLECharacteristicValue({
deviceId: this.connectedDeviceId,
serviceId: this.serviceId,
characteristicId: this.writeCharacteristicId,
value: buffer,
success: () => {
this.addLog({
date: Common.DateFormat(),
remark: "发送数据成功"
})
resolve();
},
fail: (err) => {
this.addLog({
date: Common.DateFormat(),
remark: "发送数据失败" + JSON.stringify(err)
})
reject(err);
},
complete: () => {
this.addLog({
date: Common.DateFormat(),
remark: "向设备写入数据完成"
})
}
});
操作步骤:
连接蓝牙成功,写入数据时,传入错误的serviceId
预期结果:
成功时进入success和complete回调,失败进入fail和complete回调
实际结果:
安卓苹果都一样,不进入任何回调。苹果的全对的情况,数据发送成功都不进入任何回调。
bug描述:
今天粗心大意,serviceId多复制了一个引号,然而悲剧了,success,fail,complete一个都不进,导致我的promise永远pending了,期望的是进入fail,complete
更多关于uni-app uni.writeBLECharacteristicValue当serviceId或characteristicId不正确时不进入任何回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于uni-app uni.writeBLECharacteristicValue当serviceId或characteristicId不正确时不进入任何回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这是一个已知的 BLE 通信中的常见问题。当 serviceId 或 characteristicId 参数格式不正确时,uni.writeBLECharacteristicValue 确实可能不会触发任何回调。
问题分析:
- 参数验证机制缺失:底层 BLE 栈在接收到无效 UUID 时可能直接丢弃请求,导致回调无法触发
- 平台差异:Android 和 iOS 的 BLE 实现对此类错误的处理方式不同,但都表现为静默失败
- 异步操作超时:错误的 UUID 可能导致操作在底层队列中挂起,无法完成状态反馈
解决方案:
- 在调用前添加参数验证:
if (!this.isValidUUID(this.serviceId) || !this.isValidUUID(this.writeCharacteristicId)) {
reject(new Error('Invalid UUID format'));
return;
}
- 实现超时机制:
const timeout = setTimeout(() => {
reject(new Error('BLE write timeout'));
}, 5000);
uni.writeBLECharacteristicValue({
// ... 参数
success: () => {
clearTimeout(timeout);
// ... 成功处理
},
fail: (err) => {
clearTimeout(timeout);
// ... 失败处理
}
});

