1***@163.com
1***@163.com
  • 发布:2019-03-08 12:32
  • 更新:2019-03-14 11:23
  • 阅读:2622

【报Bug】蓝牙api在app端的怪异表现

分类:uni-app

详细问题描述

蓝牙的相关api 运行到微信小程序端没有错误的体现, 一套流程完整走完. 完成了需求的解决. 反观 app端 真机测试 uni.getBluetoothDevices() 方法, 在app端运行时报错. 在蓝牙适配完成后延时调用 uni.startBluetoothDevicesDiscovery(监听蓝牙发现) 的函数, 不延时直接不监听. 不知道什么原因. 在这段执行的过程中, 看到了监听函数的作用, 打印了设备的发现. 在我执行点击事件, 执行获取全部已发现的蓝牙设备(uni.getBlueBoothDevices()) 直接报错, 没有监听的阶段不会报错, 结果是 devices 就是一个 [] 数组. 这些怪异的表现在 小程序都没有出现. 在线等解决. 急急急... QAQ
[内容]

重现步骤


    let bArr = []  // uni-app 方法报错了.  所以我用了个东西存东西, 下步调用  
    export default {  
        data() {  
            return {}  
        },  
        methods: {  
            //  获取蓝牙设备列表  
            getMyLock() {  

            },  

            //  开锁操作  
            openLock(index, item_id) {  
                uni.stopBluetoothDevicesDiscovery({  
                    success: (res) => {  
                        console.log('--停止蓝牙搜索')  
                    }  
                })  

                uni.getBluetoothAdapterState({  
                    success: (res) => {  
                        console.log('--获取搜索状态成功')  
                        console.log(JSON.stringify(res))  
                    },  
                    fail: () => {  
                        console.log('--获取搜索状态失败')  
                    }  
                })  

                console.log('***', JSON.stringify(bArr))  
                let b_uuidArr = []  
                bArr.forEach(item => {  
                    b_uuidArr.push(item.deviceId)  
                })  
                console.log(b_uuidArr)  

                //  找到所有已发现的蓝牙  T_T 这里的方法, 在监听蓝牙设备发现后, 往其中添加蓝牙项目, 这里直接报错, 不知道是 uni.onBluetoothDeviceFound() 的监听执行往设备列表中放设备出了问题还是就 getBluetoothDevices 出了问题.摸不着头脑  

//              uni.getBluetoothDevices({  
//                  success(res) {  
//                      console.log(JSON.stringify(res))  
//                      if (res.devices[0]) {  
//                          console.log(ab2hex(res.devices[0].advertisData))  
//                      }  
//                        
//                  }  
//              })  

            },  

            //  初始化蓝牙适配  
            openBluetoothAdapter() {  
                uni.openBluetoothAdapter({  
                    success: (res) => {  
                        console.log('--openBluetoothAdapter(初始化蓝牙适配)成功');  
                        console.log(JSON.stringify(res))  

                        setTimeout(() => {  
                            //  开始搜索附件蓝牙设备  
                            this.startBluetoothDevicesDiscovery()  
                        }, 0)  

                        //  监听本机蓝牙状态变化  
                        this.onBluetoothAdapterStateChange();  
                    },  
                    fail: (err) => {  
                        console.log('--初始化蓝牙适配失败! 蓝牙不可用!')  
                    }  
                })  
            },  

            //  监听本机蓝牙适配发生改变  
            onBluetoothAdapterStateChange() {  
                uni.onBluetoothAdapterStateChange(res => {  
                    console.log('--onBluetoothAdapterStateChange(监听本机蓝牙适配状态变化)')  
                    console.log(JSON.stringify(res))  
                })  
            },  

            //  搜索附件蓝牙  
            startBluetoothDevicesDiscovery() {  
                uni.startBluetoothDevicesDiscovery({  
                    // services: ['0000ffe0-0000-1000-8000-00805f9b34fb', '0000FFE0-0000-1000-8000-00805F9B34FB', 'ffe0', 'FFE0'],  
                    success: (res) => {  
                        console.log('--startBluetoothDevicesDiscovery(开始搜索蓝牙设备)')  
                        console.log(JSON.stringify(res))  

                        //  监听发现新蓝牙设备, 并将设备添加到所有设备的搜索组中  
                        this.onBluetoothDeviceFound()  
                    }  
                })  
            },  

            //  监听新蓝牙的发现  
            onBluetoothDeviceFound() {  
                uni.onBluetoothDeviceFound(function(devices) {  
                    console.log('--onBluetoothDeviceFound(监听发现新蓝牙)')  
                    console.log(JSON.stringify(devices))  
                    // console.log(this.ab2hex(devices[0].advertisData))  
                    bArr = bArr.concat(devices.devices)  
                    console.log('---bArr push', JSON.stringify(bArr))  
                })  

            },  

            ab2hex(buffer) {  
                let hexArr = Array.prototype.map.call(  
                    new Uint8Array(buffer),  
                    (bit) => ('00' + bit.toString(16)).slice(-2)  
                )  
                return hexArr.join('')  
            }  

        },  
        onShow() {  
            this.openBluetoothAdapter()  
        },  
        onLoad() {  
            this.getMyLock()  
        }  
    };

[结果]

[ERROR] : TypeError: null is not an object (evaluating 't.status')filename:file:///var/mobile/Containers/Data/Application/05A30A5F-6A0E-4663-BE24-9CF6DC58E9AB/Documents/Pandora/apps/12452E89FA2AB385C8AA05CAF17BFFB8/www/__uniappservice.htmllineno:3

[期望]
[如果语言难以表述清晰,拍一个视频或截图,有图有真相]
期望能够完美解决这种怪异的bug

IDE运行环境说明

[HBuilder 或 HBuilderX]
最新
[windows版本号]
window7

uni-app运行环境说明

运行 app 及 小程序

App运行环境说明

[iOS版本号]
12.1.4
[手机型号]
苹果6sp

附件

联系方式

[QQ] 1308689683

2019-03-08 12:32 负责人:无 分享
已邀请:
1***@qq.com

1***@qq.com

我也遇到了,openBluetoothAdapter,startBluetoothDevicesDiscovery,onBluetoothDeviceFound,createBLEConnection和监听onBluetoothAdapterStateChange整个流程在微信小程序中完美运行的。但是在un-app中onBluetoothAdapterStateChange是完全监听不到的,有时onBluetoothDeviceFound是没有回调结果的,希望官方注重看看

DCloud_heavensoft

DCloud_heavensoft

近期Android修复了这方面的一个bug。请关注近几日的qq群测版更新

  • 7***@qq.com

    现在app的这个功能解决了没?

    2019-03-18 12:18

CLP

CLP

(evaluating 't.status') 这个报错,下个版本可以解决

1***@163.com

1***@163.com (作者) - 小白爱你呀

本人不想放弃使用这个框架, 所以这周末, 好好写下使用蓝牙模块的情况.并作详细的 md 笔记, 适当上传这闪亮的小红灯. 刚才我发现了蓝牙模块中的 api 在流程上的先后执行顺序可能有问题, 这才刚开始就发现 onBluetoothAdapterStateChange 侦听时机并不是我想要的. 我还用了 延时/async await 强制等待执行也没效果. 这也导致了之后我的精确判断以至蓝牙搜索不能执行. 当然这也有可能是我自己代码问题, 不过我想要的流程和在小程序端打印的一致. app端就只能卧槽了, 请原谅我文化水平不高.

1***@163.com

1***@163.com (作者) - 小白爱你呀

对不起, 我可能没办法写蓝牙模块的区别了. 都是差距. 包括函数调用不执行. 监听延迟的. 方法错误. 报错有误. 还拿什么拯救. 真的这个模块放到接口之后有大哥成功过一次的吗?

  • CLP

    有啊,不少人再用,有用来开门的,有连接医疗设备的;官方sdk里 HBuilder-Hello工程有蓝牙的模块,但是现在的示例有点小问题,下一版很快就能发布了,你可以先用以下是新版本下载地址(修复蓝牙相关问题):

    百度网盘:https://pan.baidu.com/s/1BVQP5IBMuCMgM0A9-b3ZqQ 提取码: jbdy 等到release版发布再用release版用

    2019-03-11 13:12

  • CLP

    请仔细阅读API,理解蓝牙模块的功能

    2019-03-11 13:13

  • 1***@163.com (作者)

    回复 CLP:我试试, 我页用来开门. 正在看这个, 直接搬到uni-app中写. 正在理解..

    2019-03-11 17:29

1***@163.com

1***@163.com (作者) - 小白爱你呀

问题: 连接设备后, 获取服务值(uni.getBLEDeviceServices) 报 10005 错误, 找不到指定特征值?? 求解. 大写的 懵圈.

  • 1***@163.com (作者)

    这可能也就侧面后面在特征值获取那块也有问题. 甚至于最后读|写的操作都会有问题. 真解有木

    2019-03-12 16:18

  • 1***@163.com (作者)

    openBluebooth() {

    var self = this;

    uni.openBluetoothAdapter({

    success: function(res) {

    console.log('--开启蓝牙适配' + JSON.stringify(res))


                        //  搜索设备  
    self.startSearchBLE()

    // 监听函数启用
    // 监听本机蓝牙状态改变
    uni.onBluetoothAdapterStateChange(function(e) {
    console.log('onBluetoothAdapterStateChange: ' + JSON.stringify(e));
    });
    // 监听搜索到新设备
    uni.onBluetoothDeviceFound(function(e) {
    var devices = e.devices;
    console.log('onBluetoothDeviceFound: ' + JSON.stringify(e));
    });
    // 监听低功耗蓝牙设备连接状态变化
    uni.onBLEConnectionStateChange(function(e) {
    console.log('onBLEConnectionStateChange: ' + JSON.stringify(e));
    if (e.connected) { // 处于链接状态, 做搜索服务 -> 状态 -> 连贯开锁
    self.deviceId = e.deviceId
    setTimeout(() => {
    self.getServes()
    }, 30)
    } else { // 断开 -> 重连

    }
    });
    // 监听低功耗蓝牙设备的特征值变化
    uni.onBLECharacteristicValueChange(function(e) {
    console.log('onBLECharacteristicValueChange: ' + JSON.stringify(e));
    });

    },
    fail: function(err) {
    console.log('openBluebooth fail')
    },
    })
    },

    // 搜索设备
    startSearchBLE() {
    var self = this;
    if (true) {
    uni.stopBluetoothDevicesDiscovery({
    success: function(e) {
    console.log('停止周边设备的搜索...')
    }
    })
    }
    uni.startBluetoothDevicesDiscovery({
    services: self.services,
    success: function(e) {
    console.log('搜索附近设备成功' + JSON.stringify(e))
    setTimeout(() => {
    self.searchDevices();
    }, 300)
    },
    fail: function(e) {
    console.log('搜索附近设备失败' + JSON.stringify(e))
    }
    })
    },

    // 搜索设备
    searchDevices() {
    var self = this;
    uni.getBluetoothDevices({
    success: function(e) {
    console.log('获取搜索的设备' + JSON.stringify(e))

    var devices = e.devices;
    for (var i = 0, len = devices.length; i < len; i++) {
    var devicesItem = devices[i]
    if (myapi.isContains(devicesItem.name, self.currentLock)) {
    self.bds.push(devicesItem)
    self.connectDevice();
    }
    }
    }
    })
    },

    // 找目标设别, 进行连接
    connectDevice() {
    var self = this;
    self.bds.forEach(item => {
    console.log('--匹配设备', JSON.stringify(item))

    uni.createBLEConnection({
    deviceId: item.deviceId,
    success: function(e) {
    self.deviceId = item.deviceId;
    console.log('链接设备接口调用成功' + JSON.stringify(e))
    // 获取已连接设备
    // self.getServes()
    },
    fail: function(e) {
    console.log('connect fail')
    }
    })
    })
    },

    // 获取服务值
    getServes() {
    var self = this;
    uni.getBLEDeviceServices({
    deviceId: self.deviceId,
    success: function(e) {
    console.log('获取BLE设备服务值' + JSON.stringify(e))
    },
    fail: function(e) {
    console.log('获取BLE设备服务失败' + JSON.stringify(e))
    }
    })
    },

    }

    2019-03-12 16:40

  • CLP

    deviceID 传了吗?这个deviceID是当前已经连接上的蓝牙设备吗?是用的官方demo示例测试的吗?

    2019-03-12 16:42

  • CLP

    建议先看官方的demo,因为官方demo主功能是测通过的,关键代码可以用官方demo的

    2019-03-12 16:49

  • 1***@163.com (作者)

    回复 CLP:deviceId必须传了. 官方的 plus 看了

    2019-03-12 16:57

  • 7***@qq.com

    现在我试了下你的代码怎么搜索出的蓝牙是空数组,你遇到过吗

    2019-03-21 10:37

  • 5***@qq.com

    回复 7***@qq.com:老哥,现在换我接手这个项目了0A0

    2019-03-29 13:42

1***@163.com

1***@163.com (作者) - 小白爱你呀

继以上问题发布后, 相继的 1.66 1.68群测HX, 解决了一些蓝牙api的问题, 我依旧使用iPhone6sp测试, 发现新大陆了. 最开始获取设备服务值, 还是报(10005) 错误, 后来

几波挫折, 终于到了数据和设备之间的数据传输了... 黎明不在眼前.. 看个结果, app端和小程序端的比较
app端如下:

小程序端如下:

我的天解救

  • 1***@163.com (作者)

    是不是什么东西和我的点冲突了?? 我只传了数据给设备, 中间有几段是数据类型的转换|截取. 不懂. 两端的区别.

    2019-03-13 16:27

1***@163.com

1***@163.com (作者) - 小白爱你呀

几张监听蓝牙特征变化交互的执行图示例

CLP

CLP

连接蓝牙设备的过程会有一定的时间,连接成功之后会有回调,回调之后 再用这个 uni.getBLEDeviceServices api

  • 1***@163.com (作者)

    抛开这个问题不讲, 讨论下后面设备之间数据交互- app端让我感到很郁闷.

    2019-03-14 08:45

  • 1***@163.com (作者)

    我是在连接成功回调中调用获取服务值.

    2019-03-14 08:48

XTiger

XTiger

我也做同样的东西,我是做APP,没做微信,在安卓上基本没问题了,但在IOS上还有不少问题,加下QQ一起交流一下,我的QQ:3806994

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