蓝牙搜索得到相同的两个变量,
发布于 7 年前 作者 fliao 1866 次浏览 来自 问答

       目前测试用的蓝牙设备只有一个是开启的,按道理说是只会搜索出一个这设备通过,但是每次搜索都会得到两个相同的蓝牙设备信息,并且同时进入我的控制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
                                  })                                  
                                }
                              })
                            },

9 回复

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

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

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

同样的数据是指发现的设备 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(…)

    }

}

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肯定是唯一的。但是我们不能做成单个设备的小程序。

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

@王翊夫if

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

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

请指教

@王翊夫if

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

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

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

谢谢,您的帮助。

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

@王翊夫if

回到顶部