收藏
回答

蓝牙搜索得到相同的两个变量,

问题模块
API和组件

       目前测试用的蓝牙设备只有一个是开启的,按道理说是只会搜索出一个这设备通过,但是每次搜索都会得到两个相同的蓝牙设备信息,并且同时进入我的控制if函数内进行跳转,导致设备跳转两次页面。尝试建立iosarry 数组收集进入if里面的数据,取其中一个再跳转,发现同样会收集到两个iosarry 数组导致跳转两次;同时也尝试用ioscoant来控制进入次数,在if控制内ioscoant++,打印发现ioscoant的值都是1,没办法控制。

  请问有什么办法可以只跳转一次?

     我之前有一个蓝牙多次回调的问题,请问有结果了吗?


以下是我的搜索代码,跳转后调用stop停止搜索:

 wx.startBluetoothDevicesDiscovery({
                        services: ['FEE7'],
                        success: function (res) {
                          console.log("开始搜寻附近的蓝牙外围设备", res)
                          wx.getBluetoothDevices({
                            success: function (res) {
                              console.log("获取所有已发现的蓝牙设备", res)
                              wx.onBluetoothDeviceFound(function (devices) {
                                console.log('ios转:', devices.devices[0].name, devices.devices[0].RSSI, devices.devices[0].deviceId)
                                var deviceid = devices.devices[0].deviceId;//赋值iosuuid
                                var iosarry = new Array();//建立一个控制数组
                                var ioscoant=0;
                                if (devices.devices[0].name == "UMStand" && Math.abs(devices.devices[0].RSSI) < 90 && Math.abs(devices.devices[0].RSSI) > 20) {
                                  wx.navigateTo({
                                    url: '/pages/opennoke/opennoke?lonum=' + deviceid + '&platform=' + "ios" + '&iosloum=' + lonum
                                  })                                  
                                }
                              })
                            },

最后一次编辑于  2017-08-11  (未经腾讯允许,不得转载)
邀请回答
复制链接收藏投诉关注问题回答

9 个回答

  • 王翊夫if
    王翊夫if
    2017-08-11

    建议用deviceid做去重,iOS系统对于有自定义LocalName字段的设备,可能会上报两次 onDeviceFound

    2017-08-11
    赞同
    回复
  • 钟振智
    钟振智
    2017-08-11

    是要在判断内加deviceid,还是如何?

    iOS的deviceid不同ios的机器不是会变的吗?


    请指教


    @王翊夫if

    2017-08-11
    赞同
    回复
  • 王翊夫if
    王翊夫if
    2017-08-11

    我理解你的问题是onBluetoothDeviceFound这里的回调重复发现了两个 deviceid 相同的蓝牙设备吧,那能否用一个set对象来记录之前是否发现过该deviceid的设备呢?


    iOS上,蓝牙设备的deviceId在不同手机上不能保证一致,无法保证在单个手机上一直保持一致(系统更新、微信更新等原因),但我理解你现在是在单台手机上的小程序流程吧,单个设备在一个小程序的生命周期里对应的deviceId肯定是唯一的。

    2017-08-11
    赞同
    回复
  • 钟振智
    钟振智
    2017-08-11

    1,我用set对象记录了该设备,代码如下:

      wx.getBluetoothDevices({
                                success: function (res) {
                                  console.log("获取所有已发现的蓝牙设备", res)
                                  wx.onBluetoothDeviceFound(function (devices) {
                                    console.log('ios转:', devices.devices[0].name, devices.devices[0].RSSI, devices.devices[0].deviceId)
                                    var deviceid = devices.devices[0].deviceId;//赋值iosuuid
                                    var iosarry = new Set();//建立一个控制数组
                                    var ioscoant=0;

                                    if (devices.devices[0].name == "UMStand" && Math.abs(devices.devices[0].RSSI) < 90 && Math.abs(devices.devices[0].RSSI) > 20) {
                                      iosarry.add(devices.devices[0].name);
                                      iosarry.add(devices.devices[0].RSSI);
                                      iosarry.add(devices.devices[0].deviceId);
                                      iosarry.forEach(function (item) {
                                        console.log(item.valueOf()+ ", ");
                                      });
                                      wx.navigateTo({
                                        url: '/pages/opennoke/opennoke?lonum=' + deviceid + '&platform=' + "ios" + '&iosloum=' + lonum
                                      })                                  
                                    }
                                  })

                                },

    从ios手机上取得结果是,如下图:


    ,2,单个设备在一个小程序的生命周期里对应的deviceId肯定是唯一的。但是我们不能做成单个设备的小程序。

    2017-08-11
    赞同
    回复
  • 钟振智
    钟振智
    2017-08-11

    @王翊夫if

    2017-08-11
    赞同
    回复
  • 王翊夫if
    王翊夫if
    2017-08-11

    不好意思,实在不明白你的问题是什么,可能得重新梳理一下。

    你的问题是只有一个蓝牙设备开着,但是收到这个蓝牙设备(相同deviceId)的多次上报么?或者你意思是能搜到多个蓝牙设备?

    2017-08-11
    赞同
    回复
  • 钟振智
    钟振智
    2017-08-11

    开头我已经说了,只有一个蓝牙测试设备开着,我通过if (devices.devices[0].name == "UMStand" && Math.abs(devices.devices[0].RSSI) < 90 && Math.abs(devices.devices[0].RSSI) > 20)这条语句去刷选留下我的 测试蓝牙,但是我在这判断中打印得到了两条同样的数据并且是同时进入,导致我跳转两次页面。

    @王翊夫if

    2017-08-11
    赞同
    回复
  • 王翊夫if
    王翊夫if
    2017-08-11

    但是我在这判断中打印得到了两条同样的数据并且是同时进入,导致我跳转两次页面。


    同样的数据是指发现的设备 deviceId 是相同的么?我的意思是命中你这条语句后,在里面的逻辑判断是否之前发现过该deviceId的设备,没发现的话才执行 navigateTo 进行页面跳转


    var deviceIdSet = new Set()

    if (devices.devices[0].name == "UMStand" && Math.abs(devices.devices[0].RSSI) < 90 && Math.abs(devices.devices[0].RSSI) > 20)

    {

        if (!deviceSet.has(devices.devices[0].deviceId))

        {

                deviceSet.add(devices.devices[0].deviceId)

                wx.navigateTo(......)

        }

    }



    2017-08-11
    赞同
    回复
  • 钟振智
    钟振智
    2017-08-11

    谢谢,您的帮助。

    进过努力后发现onBluetoothDeviceFound这个接口调用了两次,问题已经解决,谢谢。

    @王翊夫if

    2017-08-11
    赞同
    回复