l***@163.com
l***@163.com
  • 发布:2023-09-15 16:50
  • 更新:2025-07-18 17:05
  • 阅读:924

【报Bug】uni.writeBLECharacteristicValue 偶发无回调

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

PC开发环境操作系统版本号: macOS 10.15

HBuilderX类型: 正式

HBuilderX版本号: 3.7.11

手机系统: iOS

手机系统版本号: iOS 16

手机厂商: 苹果

手机机型: iPhone14

页面类型: vue

vue版本: vue2

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:
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();  
});

预期结果:

能够正常写特征值,正常回调

实际结果:

调用 uni.writeBLECharacteristicValue 无回调,程序无法正常运行

bug描述:

uniapp iOS APP 蓝牙连接不稳定,特别是 uni.writeBLECharacteristicValue 多次写特征值后无回调,有一定的随机性,有时可以,有时出现问题

2023-09-15 16:50 负责人:无 分享
已邀请:
雪趣snow66

雪趣snow66

后来解决了嘛?

  • 1***@qq.com

    同问,后来解决了嘛?

    2025-07-18 17:03

7***@qq.com

7***@qq.com

有解决方法不?

1***@qq.com

1***@qq.com

你是偶发,我是必现

1***@qq.com

1***@qq.com

距离这个帖子两年了,该问题依旧,我想到个不是很合适又无赖的办法,再写个超时的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);  
                }  
            });  
        },

要回复问题请先登录注册