精华内容
下载资源
问答
  • 主要为大家详细介绍了微信小程序ibeacon三点定位的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要介绍了微信小程序iBeacon测距及稳定程序的实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 微信小程序iBeacon获取问题(wx.onBeaconUpdate不执行)【已解决】问题描述软件硬件使用代码问题现象解决办法 问题描述 长话短说,使用某公司的iBeacon标签设备,开发微信小程序获取iBeacon信息。结果一直不能进入wx...

    微信小程序iBeacon获取问题(wx.onBeaconUpdate不执行)【已解决】

    问题描述

    长话短说,使用某公司的iBeacon标签设备,开发微信小程序获取iBeacon信息。结果一直不能进入wx.onBeaconUpdate里。

    软件硬件

    平板:HUAWEI
    EMUI:10.1.0
    Android版本:10
    微信版本:7.0.21
    微信开发者工具版本:Stable v1.02.2004020

    使用代码

    var devices = [];
      doiBeaconAction: function(e){
        console.log(e)
        // 开始扫描
        
        wx.startBeaconDiscovery({
          uuids: ["XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"],
          success: function (res) {
              console.log("开始扫描设备...", res);
              // 监听iBeacon信号
              wx.onBeaconUpdate(function (res) {
                  console.log("onBeaconUpdate", res)
                  if (res && res.beacons && res.beacons.length > 0) {
                      devices = res.beacons
                      // 此处最好检测rssi是否等于0,等于0的话信号强度等信息不准确。我是5秒内重复扫描排重。
                  }
              })
          },
          fail: function(res) {
            console.log("fail", res)
          },
          complete: function(res) {
            console.log("complete", res)
          }
        }),
    
        // 超时停止扫描
        setTimeout(function () {
          wx.stopBeaconDiscovery({
              success: function () {
                  console.log("停止设备扫描!");
                  console.log(devices);
              }
          });
        }, 20 * 1000)
        
      }
    

    问题现象

    wx.startBeaconDiscovery可以进入,success回调成功,但wx.onBeaconUpdate的回调没有办法进入。
    流程是没有问题的

    	   wx.stopBeaconDiscovery # 停止扫描
    		↑
    	   setTimeout # 超时设置
    		↑
    开始 → wx.startBeaconDiscovery # 开始扫描
    		︱
    		︱―fail(err)→结束
    		︱
    	   success(res)
    		↓
           wx.onBeaconUpdate # 监听iBeacon信号
    		︱  
    		︱―fail(err)→结束
    		︱
    	   success(res)
    		↓
           TODO
           
    

    解决办法

    对手机的微信权限设置:应用–>应用管理–>微信–>权限–>位置信息–>允许。
    这个结果我也完全没有想到,但实测就是这样子。希望可以帮到大家。
    参考链接:
    错误方案:wx.onBeaconUpdate不执行
    本次正确方案:【问题BUG?】uni.onBeaconUpdate在微信小程序端不支持部分机型

    展开全文
  • 微信小程序2017年开始支持iBeacon,摇一摇附近就是基于iBeacon实现的,此外iBeacon还可以实现距离测量,本文将介绍如何基于微信小程序实现iBeacon测距。 iBeacon测距原理 蓝牙信标发射的信号强度(rssi)与收发设备...

    iBeacon是苹果公司推出的一项低耗能蓝牙技术,由蓝牙设备发射包含指定信息的信号,再由移动设备接收信号,从而实现近场通信。微信小程序2017年开始支持iBeacon,摇一摇附近就是基于iBeacon实现的,此外iBeacon还可以实现距离测量,本文将介绍如何基于微信小程序实现iBeacon测距。

    iBeacon测距原理

    蓝牙信标发射的信号强度(rssi)与收发设备之间的距离,某种程度上呈正相关,因此通过合理的运算转化,可以通过rssi的值反推出与接收设备间的距离。

    蓝牙信标的rssi值是一个参考值,没有固定标准。想要计算出蓝牙信标的距离,还必须知道这个信标设备的txPower值。txPower是指当距离蓝牙信标1m时的rssi值,不同的蓝牙设备或相同设备不同的工况甚至不同的场地环境,都会影响txPower值,因此这个值虽然可以测量,但一定程度上是个经验值,无法测准。

    rssi测距公式

    知道rssi和txPower后就可以计算距离了,有两种计算公式:

    一、

    这个公式里的三个变量A、B、C都是经验值,需要根据手机系统或硬件型号精确调校,通常会将所有设备的校准结果保存成一个设备信息表,移动终端先检测本机型号,然后匹配设备信息调取相应的计算配置,再进行计算。很明显这个公式是比较依赖硬件调校的,没有数据储备的前提下这个公式会很难用。

    转换成js代码:

    1
    2
    3
    
    const calculateAccuracy = function (txPower, rssi) {
      return (0.89976) * Math.pow(rssi / txPower, 7.7095) + 0.111
    }
    

    未精校情况下的测距表现:

    先说这个图怎么看。

    纵轴代表测量距离,横轴代表时间,每隔一秒取样一次,图中是近10次取样的数值曲线。
    绿线是设备接收到的rssi值,反应硬件真实接收到的数据情况;
    红线是套用公式计算得出的瞬时距离;
    黄线是微信小程序自带的瞬时测距结果。

    蓝牙信标与手机的实际距离1m,测试设备为红米Note7。

    从上图可见,rssi值相对稳定,说明硬件没有太大问题。红线和黄线的波动都很大,说明准确度不咋地。二者的波动趋势几乎一致,所以有理由怀疑微信小程序内部也是用的这个测距公式。从结果来看,这个公式的准确度比较差,可能是因为没有精校的原因。

    二、

    这个公式里的A就是rssi,tx是txPower,n是经验值,n的取值跟物理环境有关。

    转换成js代码:

    1
    2
    3
    
    const calculateAccuracy = function (txPower, rssi) {
      return Math.pow(10, Math.abs(rssi - txPower) / (10 * 4))
    }
    

    公式二的测距表现:

    人比人得死,货比货得扔啊。

    图中黄线还是波动的那么疯狂,但红线却异常稳定,而且呈现出跟绿线一致的波动幅度,说明测距精度靠谱。这个公式只有一个参数,生产环境中的调校相对简单,这里我们选择公式二作为测距公式。

    iBeacon测距稳定程序

    蓝牙信号本身就有波动性,加上现实环境中的很多因素也会影响到信号强度,比如物体遮挡、设备方向变化、硬件自身的稳定性等,所以接收设备检测到的rssi值通常是“跳动”的,直接使用测距公式算出的结果,往往不可用。必须实现一个稳定程序,让计算结果呈现出连续性和稳定性。

    数据滤波

    稳定程序主要做的事就是对波段数据“削峰填谷”,也可以称作数据滤波。最简单的滤波处理,就是收集一段时间的值求平均,只要硬件不出问题,固定距离的蓝牙信标rssi值总是会在一个相对稳定的区间内变化,采样时间越长,采样的平均值就会越接近真实值,因此在静态测距场景中,求平均是最佳方式。

    1
    2
    3
    4
    
    //求数组平均值
    const arrayAverage = arr => arr.reduce((acc, val) => acc + val, 0) / arr.length;
    
    return arrayAverage([...])
    

    具体实现是,当程序源源不断的接收到信标的rssi时,先用公式计算出瞬时测距结果,然后将结果存进一个数组,然后计算这个数组的平均值。静态测距时,测量结果还是非常准的,2m以内的距离误差可以低至0.1m。

    实际应用中往往都是动态测距,所以采样数据的长度要加以限制,比如按后进先出的顺序,取最近10组数据。具体采样队列设为多长,要根据项目实际需求而定。采样队列的长度越长,测距结果越平滑,但对移动端的动态捕捉越迟钝;反之采样队列越短,结果越锐利,对移动端的动态捕捉越灵敏。

    有时因为一些偶然因素,采样队列中会出现个别大幅偏离真实值的“燥音”数据,即使求平均也难以有效抹除影响,为消除这种影响,可以在求平均前先用高斯模糊算法对“偏大值”和“偏小值”做平滑处理,最大限度的降低数据噪音的干扰。

    高斯模糊算法的关键是根据平均差求权重,一维高斯模糊的权重计算公式:

    转换成js代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    //求一维队列某点的高斯模糊权重 @param(队列长度,目标位置, 平均差)
    const getOneGuassionArray = function (size, kerR, sigma) {
      if (size % 2 > 0) {
        size -= 1
      }
      if (!size) {
        return []
      }
      if (kerR > size-1){
        return []
      }
      let sum = 0;
      let arr = new Array(size);
    
      for (let i = 0; i < size; i++) {
        arr[i] = Math.exp(-((i - kerR) * (i - kerR)) / (2 * sigma * sigma));
        sum += arr[i];
      }
    
      return arr.map(e => e / sum);
    }
    

    关于“偏大值”和“偏小值”的概念将在下文介绍,这里只要知道我们的模糊目标是那些“极端数据”就行了。

    时间加权

    基于采样队列求平均的处理方式,不可避免的会让结果产生滞后性,这时可以引入时间加权的补偿算法。

    所谓时间加权,是指在求平均值的时候,给距离当前时间较近的值更高的计算权重,反之给距离当前时间较远的值较低的计算权重,实现起来也非常简单。

    以最简单的权重分配为例,将采样队列一分为二,按时间远近定位为“当前组”和“过去组”,比如说我想让当前组的权重是过去组的2倍,那么只要将当前组数据全部复制一份加入队列,然后再计算新队列的平均值。

    1
    2
    3
    4
    
    //时间加权处理
    queue = queue.slice(0, parseInt(queue.length / 2)).concat(queue)
    //求平均
    return arrayAverage(queue)
    

    动态跟进

    经过时间加权处理后,数据的滞后性会得到一定的抑制,但如果遇到比较“陡峭”的距离变化,这种处理仍然会给出一个相对“平滑”的反馈,为了让稳定程序能更好的感知动态变化,并且做出跟进反应,还需要人为的设置一些特殊条件。

    首先,如何判断移动设备正在远离或靠近?

    这里有一个简单的思路,可以先找出采样队列中的最大值和最小值,然后以一定的阈值找出偏大值和偏小值。比如队列中的最大值是3,最小值是1,阈值设置为0.1m,那么大于2.9m的数据都算偏大值,小于1.1m的数据都算偏小值。偏大值和偏小值的队列长度最长不超过总队列的二分之一。

    然后,如果偏大值集中在队列的前三分之一部分,那么我们可以认为移动设备正在果断远离;反之偏小值集中在队列的前三分之一部分,则可以认为移动设备正在靠近。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    //maxCount为偏大值的序号数组
    //minCount为偏小值的序号数组
    //queueLength为队列长度
    
    if (arrayAverage(maxCount) < parseInt(queueLength / 3)) {
        console.log(`正在远离`)
    } else if (arrayAverage(minCount) < parseInt(queueLength / 3)) {
        console.log(`正在靠近`)
    }
    

    基于这种远离和靠近的趋势判断,我们可以人为的让数据向运动方向做更激进的倾斜。怎么做呢?跳过时间加权逻辑,如果判断为正在远离,那么就将队列中的偏小值过滤掉,反之则将偏大值过滤掉,只计算剩下的数据;这种处理会得到一个明显过激的结果,但考虑到现实世界中的运动往往具有惯性,这种激进处理,可能会更贴合真实的运动情况,而且让数据的响应更“灵敏”。

    效果检验

    做到目前为止效果怎么样呢,直接看图吧。

    下图中,绿线依然是rssi值,红线是根据rssi直接算出来的瞬时测距结果,黄线是加入稳定程序后的测距结果。

    第一张图是相对静止的条件,可以看到黄线相对红线明显更加平稳,说明稳定程序还是起作用的。

    第二张图是模拟快速远离的场景,可以看到黄线在保证平稳的前提下紧跟红线,没有被甩掉,主要体现的是稳定程序的动态跟进效果。

    第三张图是抡胳膊甩手机+遮挡信号模拟出的场景,貌似稳定程序也架不住了,有点飘忽。

    以上是关于稳定程序的简要实现思路,生产环境中肯定会面临更加复杂的情况,免不了还要做大量调试,这里只是抛砖引玉。

    总结

    蓝牙测距简单来说就是一个公式的应用,本身比较简单,基于测距可以实现很多近场应用,比如近场签到、近场推送等等,更进一步甚至可以实现对移动设备的定位,有了定位信息,很多室内定位、室内导航相关的应用就都可以实现了,下一篇会详细讲解如何基于iBeacon技术实现定位。

    转载出处:https://refined-x.com/2019/03/30/微信小程序iBeacon测距及稳定程序的实现/

    展开全文
  • function search() { var that = this; //检查蓝牙状态 wx.openBluetoothAdapter({ ... wx.startBeaconDiscovery({ //搜索附近的iBeacon设备 uuids: ['74278adb-b644-4520-8f0c-720eaf059935'...
        function search() {
          var that = this;
            //检查蓝牙状态
            wx.openBluetoothAdapter({
              success: function (res) { //蓝牙打开
                wx.startBeaconDiscovery({ //搜索附近的iBeacon设备
                  uuids: ['74278adb-b644-4520-8f0c-720eaf059935'],//uuid参数
                  success: function (res) {
                    //控制台打印 
                    wx.onBeaconUpdate(function(res){
                      console.log("打印监听到的设备信息" + res.beacons);
                      console.log(res.beacons);
      
                      if(res.beacons.accuracy != -1){
                        wx.stopBeaconDiscovery({
                          success: function () {
                          }
                        })
                        //扫描到ibeacon设备 向后台发送请求  获取签到表信息
                        wx.request({
                          url: that.data.url+'/api/sign/searchIbeacon',
                          data: {
                            ibeaconId: res.beacons[0].uuid,
                            signTime: that.data.signTime
                          },
                          header: {
                            'content-type': 'application/json' // 默认值
                          },
                          method: 'POST',
                          success: function (res) {
                            that.setData({
                              signId: res.data[0].signId
                            })
                            	//成功获取到 签到表信息后 发送自身签到数据
                                wx.request({
                                  url: that.data.url+'/api/sign/relevanceSign',
                                  data: {
                                    signId: that.data.signId,
                                    peopleId: that.data.peopleId,
                                    signTime: that.data.signTime
                                  },
                                  header: {
                                    'content-type': 'application/x-www-form-urlencoded' // 默认值
                                  },
                                  method: 'POST',
                                  success: function (res) {
                                  	//签到成功跳转成功页面
                                    if(res.data == 0){
                                      wx.navigateTo({
                                        url: '../signSuccess/signSuccess',
                                      })
                                      //返回1表示已经完成签到提示无需重复签到
                                      
                                    }else if(res.data == 1){
                                      that.setData({
                                        text:"你已经完成签到无需重复操作"
                                      })
                                    }
                                    
                                  }
                                })
    
                          }
                        })
      
                      }
                    })
                  },
                  fail: function (res) {
                    //先关闭搜索再重新开启搜索,这一步操作是防止重复wx.startBeaconDiscovery导致失败
                    stopSearchBeacon();
                  }
                })
              },
              fail: function (res) {//蓝牙状态:关闭
                wx.showToast({ title: "请打开蓝牙", icon: "none", duration: 2000 })
              }
            })
    
          // }
        }
    
    展开全文
  • 前话 微信小程序开发带着许多坑,最近就遇到了个需求,检测iBeacon来进行地点签到。 (╯▔皿▔)╯ 微信小程序对于iBeacon的文档也写的十分精简,只简单介绍了每个接口的作用,这就导致我以为简单...

    前话

    微信小程序开发带着许多坑,最近就遇到了个需求,检测iBeacon来进行地点签到。

    (╯▔皿▔)╯

    微信小程序对于iBeacon的文档也写的十分精简,只简单介绍了每个接口的作用,这就导致我以为简单调用单个接口即可实现功能,因此我就写出了这样的错误代码逻辑 :

    (╯‵□′)╯︵┻━┻

    wx.startBeaconDiscovery({
        uuids: ['xxxxx'],
        success(res){
            console.log('签到成功')
        },
        fail(err){
            console.log('签到失败')
        }
    })

    结果是,点击签到按钮调用该接口的时候,几乎都是

    签到失败

    (╯‵□′)╯炸弹!•••*~●。

    当然,最后还是谷歌解决了,因为前人也踩了这个坑,因此我还是搬运过来,让后人少受熬夜之苦 (;´༎ຶД༎ຶ`)

    正题

    废话不多说,如果你要检测接收iBeacon信号,建议按照这样的接口调用步骤:

           wx.stopBeaconDiscovery # 停止扫描
            ↑
           setTimeout # 超时设置
            ↑
    开始 → wx.startBeaconDiscovery # 开始扫描
            ︱
            ︱―fail(err)→结束
            ︱
           success(res)
            ↓
           wx.onBeaconUpdate # 监听iBeacon信号
            ︱  
            ︱―fail(err)→结束
            ︱
           success(res)
            ↓
           TODO
           

    最后,我的代码如下:

    var devices = [];
    
    // 开始扫描
    wx.startBeaconDiscovery({
        uuids: uuidArray,
        success: function () {
            console.log("开始扫描设备...");
            // 监听iBeacon信号
            wx.onBeaconUpdate(function (res) {
                // 请注意,官方文档此处又有BUG,是res.beacons,不是beacons。
                if (res && res.beacons && res.beacons.length > 0) {
                    devices = res.beacons;
                    // 此处最好检测rssi是否等于0,等于0的话信号强度等信息不准确。我是5秒内重复扫描排重。
                }
            });
        }
    });
    
    // 超时停止扫描
    setTimeout(function () {
        wx.stopBeaconDiscovery({
            success: function () {
                console.log("停止设备扫描!");
                console.log(devices);
            }
        });
    }, 5 * 1000);

    OK,问题似乎不经意间被完美解决了( •̀ ω •́ )y


    更多专业前端知识,请上 【猿2048】www.mk2048.com
    展开全文
  • startBeaconDiscovery接口返回success表示是开始搜索周边指定UUID的beacon设备,不代表可以检测到beacon设备信号, 如果start成功后能收到 onBeaconUpdate 回调并获取到设备信息,才是搜索到指定beacon设备的信号,...
  • 目录中创建 微信小程序文件 在生命周期函数 onLoad()中写入代码 ```script //监听蓝牙切换的状态 蓝牙切换状态 执行search函数 wx.onBluetoothAdapterStateChange(function(res){ if(res.available){ ...
  • 金桔ibeacon设备是标准的ibeacon设备,通过小程序扫描,可以获取ibeacon的信息。 看代码: searchBeacon() { if (!wx.openBluetoothAdapter) { this.showError("当前微信版本过低,无法使用该功能,请升级到最新...
  • 基于ibeacon蓝牙定位(微信小程序

    千次阅读 2019-09-27 20:35:15
    前段时间做定位,查了很多资料,最后感觉ibeacon做定位比较简单,主要微信小程序有对应的接口所以非常简单。需要的硬件ibeacon,这个硬件在淘宝都有,简单的定位一个就可以,复杂就需要根据需求购买了。 ibeacon主要...
  • 小程序ibeacon三点定位

    万次阅读 多人点赞 2017-11-03 16:34:16
    空余时间简单写了一个微信小程序 ibeacon三点定位。 事先淘宝买了七八个ibeacon小设备,放置在办公司角落。分别设置三个ibeacon的位置坐标点,根据每一个ibeacon到已经开启蓝牙的目标物距离,计算出目标物在当前...
  • 完整微信小程序(Java后端) 技术贴目录清单页面(必看) 微信小程序框架所提供的API接口也是相当完备的,如果说小程序组件是用来构建小程序的视图层,那么小程序API则在小程序逻辑层担当重任。随着小程序版本的更新迭代...
  • 微信小程序目录

    千次阅读 2018-01-18 17:20:55
    此文章只是为了让你能清楚微信小程序能做到哪些事情,如想学习到完整的知识,还请移步到微信小程序开发文档以及查阅相关的实例资料。微信小程序代码结构由四部分组成:具体代码查看微信小程序开发文档1、json配置⑴ ...
  • 微信小程序————setData()方法的使用和注意事项

    万次阅读 多人点赞 2018-08-10 16:43:37
    微信小程序setData()使用: Page.prototype.setData(Object data, Function callback) setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)。 参数说明: Object...
  • 正文的最前面先公布一下微信iBeaconID(微信官方iBeacon的UUID): FDA50693-A4E2-4FB1-AFCF-C6EB07647825,Major:10001,Minor:12345 微信到时候可能会有好几个iBeaconID(即UUID),但肯定不是每个商户都有一...
  • 微信小程序设备API: 剪贴板 蓝牙适配器接口 iBeacon 屏幕亮度 用户截屏事件 振动 微信小程序WXML: WXML节点信息 第三方平台 微信小程序开放接口: 用户数据的签名验证和加解密 wx.getUserInfo(OBJECT) 微信支付 ...
  • 微信小程序转百度小程序修改 百度小程序很多兼容性问题已修复,具体细节请参考官方开发文档:https://smartprogram.baidu.com/docs/develop/fuctionlist/list/ ——————————————————...
  • 微信小程序文档大纲 供参考

    千次阅读 2019-04-30 11:01:39
    首先亮出微信小程序文档地址:https://developers.weixin.qq.com/miniprogram/dev/ 一、指南 1、起步 小程序简介: 小程序技术发展史 -- 将h5的js-sdk如何变成小程序的 小程序与普通网页开发的区别 体验小...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 243
精华内容 97
关键字:

微信小程序ibeacon

微信小程序 订阅