6***@qq.com
6***@qq.com
  • 发布:2020-09-30 15:26
  • 更新:2022-09-15 15:45
  • 阅读:2919

PAD成功连接蓝牙后,uni.getBLEDeviceServices 报错10004, 【报Bug】

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Mac

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

HBuilderX类型: 正式

HBuilderX版本号: 2.8.11

手机系统: Android

手机系统版本号: Android 7.1.1

手机厂商: 华为

手机机型: PAD

页面类型: vue

打包方式: 云端

项目创建方式: HBuilderX

示例代码:

我前面通过 uni.openBluetoothAdapter 初始化蓝牙后,使用uni.onBluetoothDeviceFound监听寻找设备,通过如下操作,成功连接到蓝牙后, 我通过uni.getBLEDeviceServices 怎么都是service为空,延时没有用,我最大给到了10S去获取服务,依旧是报错10004。
特别说明:
我打包成APP,在手机上跑,是一点问题没有的。
但是我打包成APP,放在PAD上跑,就会出现这个问题。
安卓平板,系统7.1.2, 是横屏的,跟超市收银台使用的那种一样,平板收银。

uni.createBLEConnection({
deviceId: deviceId,
complete(res) {
if (res.errMsg == "createBLEConnection:ok") {
succToast("连接蓝牙--成功");
console.log("连接蓝牙-[" + item.name + "]--成功")
currDev = item;
// 一定要延时,不然 getBLEServices 获取不到信息
setTimeout(function() {
getBLEServices(deviceId)
}, 2000)
} else {
errorToast('连接蓝牙失败,请确认打印机蓝牙正常')

            console.log(res)  
        }  
        //连接成功 关闭搜索  
        stopFindBule()  
    },  
})  

function getBLEServices(_deviceId) {

let deviceId = _deviceId  
    console.log(_deviceId)  
console.log("获取该蓝牙设备所有服务(service)。---------------")  
uni.getBLEDeviceServices({  
    // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
    deviceId: deviceId,  
    complete(res) {  
        console.log('-------uni.getBLEDeviceServices-------')  
        console.log(res)  
        if(!res.services||res.services.length.length==0){  
            errorToast('getBLEDeviceServices 为空')  
            return false;  
        }  
        let serviceId = "";  
        for (var s = 0; s < res.services.length; s++) {  
            console.log(res.services[s].uuid)  
            let serviceId = res.services[s].uuid  
            uni.getBLEDeviceCharacteristics({  
                // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接  
                deviceId: deviceId,  
                // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取  
                serviceId: serviceId,  
                success(res) {  
                    var re = JSON.parse(JSON.stringify(res))  
                    console.log('deviceId = [' + deviceId + ']  serviceId = [' + serviceId + ']')  
                    for (var c = 0; c < re.characteristics.length; c++) {  
                        if (re.characteristics[c].properties.write == true) {  
                            let uuid = re.characteristics[c].uuid  
                            console.log(' deviceId = [' + deviceId + ']  serviceId = [' + serviceId + '] characteristics=[' +  
                                uuid)  
                                // 获取UUID和serviceId  
                            currDev.services = {  
                                serviceId: serviceId,  
                                characteristicId: uuid  
                            };  

                            overToast('连接服务成功');  
                            console.log('currDevcurrDevcurrDevcurrDevcurrDev')  
                            console.log(JSON.stringify(currDev));  

                        }  
                    }  
                }  
            })  
        }  
    },  
    fail(res) {  
        console.log(res)  
    },  
})  

}

操作步骤:

我前面通过 uni.openBluetoothAdapter 初始化蓝牙后,使用uni.onBluetoothDeviceFound监听寻找设备,通过如下操作,成功连接到蓝牙后, 我通过uni.getBLEDeviceServices 怎么都是service为空,延时没有用,我最大给到了10S去获取服务,依旧是报错10004。

预期结果:

应该会获取到service的结果的

实际结果:

报错10004

bug描述:

2020-09-30 15:26 负责人:DCloud_Android_zl 分享
已邀请:
hanxu1997

hanxu1997

可以参考这篇文章:小程序 蓝牙重连异常 errCode:10004
实测:getBLEDeviceServices接口报错10004时,重新调用getBluetoothDevices再次匹配获取deviceId,之后按原有步骤继续进行蓝牙连接即可解决10004问题。

  • 6***@qq.com (作者)

    这个没用,每次进入都是重新扫描得到的 最新的数据,

    2020-11-09 17:02

  • hanxu1997

    回复 6***@qq.com: 每次进入哪里?最新的数据指什么?getBluetoothDevices获取到的蓝牙设备列表?这样有啥问题呢,可以描述得具体点吗?

    2020-11-10 11:44

  • 6***@qq.com (作者)

    回复 hanxu1997: 每次都是通过 uni.createBLEConnection 建立连接成功了的,再去获取的uni.getBLEDeviceServices。 我前面通过 uni.openBluetoothAdapter 初始化蓝牙后,使用uni.onBluetoothDeviceFound监听寻找设备找到设备后,uni.createBLEConnection,成功连接到蓝牙。 后面依旧是getBLEDeviceServices 10004

    2020-11-11 11:32

  • hanxu1997

    回复 6***@qq.com: 你有时间可以trytry:判断getBLEDeviceServices报错10004,自动回到getBluetoothDevices这步,在已发现的蓝牙设备列表中重新匹配获取deviceId,然后再createBLEConnection,再getBLEDeviceServices,应该就不会10004

    2020-11-12 09:23

  • 6***@qq.com (作者)

    回复 hanxu1997: 好 下次遇到这个case 我重点这里试试。

    2020-11-16 15:25

  • 3***@qq.com

    我用这个解决了Noice监听不到的问题

    2023-07-04 15:50

6***@qq.com

6***@qq.com (作者) - 清风徐来

唉,又沉了, 无尽的bug 啊

1***@qq.com

1***@qq.com - 一句话,干,遇见问题就干他,干不了他,找办法

同样的问题啊,咋办呀

  • 6***@qq.com (作者)

    所以每次都不想提BUG,提了也没人处理

    2020-10-27 12:05

激流勇进

激流勇进

请问这个问题 您解决了吗

Azikou

Azikou

我华为的荣耀V10也有相同问题,换了个小米酒正常了,可能BLE各厂商有区别

b***@gmail.com

b***@gmail.com

我这边小程序蓝牙正常,打包app,就是10004了,

b***@gmail.com

b***@gmail.com

用settimeout,延迟2秒,就可以了

该问题目前已经被锁定, 无法添加新回复