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

1 回复

更多关于uni-app uni.writeBLECharacteristicValue当serviceId或characteristicId不正确时不进入任何回调的实战教程也可以访问 https://www.itying.com/category-93-b0.html


这是一个已知的 BLE 通信中的常见问题。当 serviceIdcharacteristicId 参数格式不正确时,uni.writeBLECharacteristicValue 确实可能不会触发任何回调。

问题分析:

  1. 参数验证机制缺失:底层 BLE 栈在接收到无效 UUID 时可能直接丢弃请求,导致回调无法触发
  2. 平台差异:Android 和 iOS 的 BLE 实现对此类错误的处理方式不同,但都表现为静默失败
  3. 异步操作超时:错误的 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);
        // ... 失败处理
    }
});
回到顶部