首页 > 课堂 > 小程序 > 正文

微信小程序ibeacon三点定位详解

2020-03-21 16:08:44
字体:
来源:转载
供稿:网友

空余时间简单写了一个微信小程序ibeacon三点定位。

事先淘宝买了七八个ibeacon小设备,放置在办公司角落。分别设置三个ibeacon的位置坐标点,根据每一个ibeacon到已经开启蓝牙的目标物距离,计算出目标物在当前区域内坐标位置。适用于区域内购物指示。当然,进入该区域事先要打开手机蓝牙。

下面代码:

var app = getApp() Page({ data: {  motto: 'Hello World',  openBLE:'打开蓝牙设备',  startBLEDiscovery:'初始化蓝牙设备',  startBLEDevices:'目标定位',  reStartSearchBLE:'重置蓝牙',  startSearchBLE:'默认空',  userInfo: {},  deviceId: '',  searchFlag:true,  deviceRSSI:'',  deviceName:'',  deviceId:[],  advertisServiceUUIDs: [],  advertisData:[],  canvasPointX:'',  canvasPointY:'',  avatarUrl:'../index/bg-image.jpg',  showPosition:''  }, //事件处理函数 bindViewTap: function() {  wx.navigateTo({   url: '../logs/logs'  }) }, onLoad: function () {   var that = this  //调用应用实例的方法获取全局数据   //that.setData({ deviceId: opt.deviceId })   app.getUserInfo(function(userInfo){   //更新数据    that.setData({    userInfo:userInfo   })   //判断兼容性   if (wx.openBluetoothAdapter) {    //打开蓝牙适配器,如果没有打开 showtoast   wx.openBluetoothAdapter({    success: function(res){     // success     //获取本机的蓝牙适配器状态     wx.getBluetoothAdapterState({      success: function(res){       // success       that.setData({        searchFlag:true       })       },      fail: function(res) {       // fail        that.setData({        searchFlag:false       })      },      complete: function(res) {       // complete      }     })    },    fail: function(res) {     // fail 本机是否已经打开蓝牙设备      wx.showToast({title:'请打开本机蓝牙设备,重新扫码', duration:10000 })    },    complete: function(res) {     // complete    }   })   } else {     // 如果希望用户在最新版本的客户端上体验您的小程序,可以这样子提示     wx.showModal({      title: '提示',      content: '当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试。'     })    }       })  },    startBLEDevices: function(){    var that = this      wx.startBluetoothDevicesDiscovery({      services: [],      success: function(res){        //获取本机蓝牙设备状态           // success        that.setData({        showPosition:setInterval(that.devicesFunc,1000)       })        },      fail: function(res) {      // fail      },     complete: function(res) {      // complete      }    })  }, // startBLEDevices: function(){ //  var that = this //  that.setData({ //   showPosition:setInterval(that.devicesFunc,1000) //  })  // },  devicesFunc: function(){    var that = this         wx.getBluetoothDevices({     success: function(res){      // console.log(res);       var arrayRSSI = new Array();      var arraydeviceName = new Array();      var arraydeviceId = new Array();      // var arrayUUIDs = new Array();      var arrayadvertisData = new Array();       var pointADistance = '';      var pointBDistance = '';      var pointCDistance = '';       for(var i = 0; i<res.devices.length;i++){         //console.log(res.devices[i].name);        if(res.devices[i].name.indexOf('craft')==0){         //console.log(res.devices[i]);        arrayRSSI.push(res.devices[i].RSSI);        arraydeviceName.push(res.devices[i].name);         arraydeviceId[i]= res.devices[i].deviceId;        arrayUUIDs[i]= res.devices[i].advertisServiceUUIDs[i];        arrayadvertisData[i]= res.devices[i].advertisData  ;        调用计算rssi对应距离的函数        var iRssi = Math.abs(arrayRSSI[i]);         var power = (iRssi-59)/(10*2.0);         var mm = Math.pow(10, power);         console.log(arraydeviceName[i]+"距离的位置是"+mm+"米");          取01,02,03分别为,(2,0),(2,2),(0,2)固定坐标点,做定位                if(res.devices[i].name.indexOf('craft01')==0){                 var pointARSSi = res.devices[i].RSSI ;        var iRssi = Math.abs(pointARSSi);         var power = (iRssi-55)/(10*2.0);         var pointADistance = Math.pow(10, power);         console.log("a"+pointADistance);         console.log(pointARSSi);                }        if(res.devices[i].name.indexOf('craft02')==0){                 var pointBRSSi = res.devices[i].RSSI;        var iRssi = Math.abs(pointBRSSi);         var power = (iRssi-55)/(10*2.0);         var pointBDistance = Math.pow(10, power);         console.log("b"+pointBDistance);        console.log(pointBRSSi);                 }        if(res.devices[i].name.indexOf('craft03')==0){                var pointCRSSi = res.devices[i].RSSI;        var iRssi = Math.abs(pointCRSSi);         var power = (iRssi-57)/(10*2.0);          var pointCDistance = Math.pow(10, power);         console.log("c"+pointCDistance);         console.log(pointCRSSi);         }        }       }       // 从 arrayRSSI 取三个距离定位点最近的ibeacon参与定位      if(arrayRSSI.length > 3){        //根据arrayRSSI进行信号强弱排序.距离越远rssi值越小        for(var i = 0 ; i < arrayRSSI.length ; i ++){         for(var j = i+1 ; j< arrayRSSI.length ; j++){          if(arrayRSSI[i]<arrayRSSI[j]){           var select = arrayRSSI[i];           arrayRSSI[i] = arrayRSSI[j];           arrayRSSI[j] = select;          }         }         }        //获取最近的三个距离        for(var i = 0 ; i < 3; i++){          if(i==0){            var pointARSSi = res.devices[i].RSSI ;           var iRssi = Math.abs(pointARSSi);            var power = (iRssi-55)/(10*2.0);            var pointADistance = Math.pow(10, power);            console.log("a"+pointADistance);            console.log(pointARSSi);           }          if(i==1){                      var pointBRSSi = res.devices[i].RSSI;           var iRssi = Math.abs(pointBRSSi);            var power = (iRssi-55)/(10*2.0);            var pointBDistance = Math.pow(10, power);            console.log("b"+pointBDistance);           console.log(pointBRSSi);           }          if(i==2){            var pointCRSSi = res.devices[i].RSSI;           var iRssi = Math.abs(pointCRSSi);            var power = (iRssi-57)/(10*2.0);             var pointCDistance = Math.pow(10, power);            console.log("c"+pointCDistance);            console.log(pointCRSSi);           }          }       }         //获取定位点的x和y        if(!pointADistance==''&&!pointBDistance==''&&!pointCDistance==''){        var pointDX='';var pointDY = '';        var p = Math.pow(pointADistance,2)/10-Math.pow(pointBDistance,2)/10;        pointDX = 2.5 - p;          var m = Math.pow(pointADistance,2)/10-Math.pow(pointCDistance,2)/10;        pointDY = 2.5 - m;          console.log('目标所在位置X是'+pointDX);        console.log('目标所在位置Y是'+pointDY);         if(pointDX > 0 && pointDY > 0){          wx.showToast({title:'欢迎进入25楼craft', duration:4000 });          }        that.setData({          canvasPointX:pointDX,          canvasPointY:pointDY         })                //创建画布         //计算坐标点在规定canvas上的位置显示        var context = wx.createCanvasContext();         context.setStrokeStyle("#00ff00");        //a,b,c,d,e,f  a,b起始坐标,c半径,d,e起始和终止角度         context.arc(that.data.canvasPointX*30,that.data.canvasPointY*30,5,0,2*Math.PI);        context.fill();        wx.drawCanvas({         canvasId: 'firstCanvas',         actions: context.getActions() // 获取绘图动作数组        })          wx.showModal({title:'X轴:'+pointDX+'Y轴:'+pointDY, duration:5000 });          //开始网络请求         wx.request({          url: 'http://craftww.cn/weixinIbeacon/index.php',          data: {},          method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT          // header: {}, // 设置请求的 header          success: function(res){           // success          },          fail: function(res) {           // fail          },          complete: function(res) {           // complete          }         })         }else{        wx.showToast({title:'正在搜索...', duration:1000 })         开始网络请求         wx.request({          url: 'http://craftww.cn/weixinIbeacon/index.php',          data: {},          method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT          // header: {}, // 设置请求的 header          success: function(res){           // success          },          fail: function(res) {           // fail          },          complete: function(res) {           // complete          }         })        }       },     fail: function(res) {      // fail     },     complete: function(res) {      // complete     }    })   } ,  //动态显示  createList: function(thisName){   var that = this      that.setData({      array:[{deviceDistance:"1"},{deviceDistance:"1"},{deviceDistance:"1"},{deviceDistance:"1"},{deviceDistance:"1"}]     })   },  reStartSearchBLE: function(){    var that = this  //清除本地数据缓存  wx.stopBluetoothDevicesDiscovery({   success: function(res){    // success   },   fail: function(res) {    // fail   },   complete: function(res) {    // complete   }  })   wx.clearStorageSync();   clearInterval(that.data.showPosition);    console.log(that.data.showPosition);  // that.context.clearRect(0,0,canvas.width,canvas.height);   //断开蓝牙   var that = this   wx.closeBluetoothAdapter({    success: function(res){     // success     console.log('重置成功');     //打开蓝牙适配器,如果没有打开 showtoast   wx.openBluetoothAdapter({    success: function(res){     // success     //获取本机的蓝牙适配器状态     wx.getBluetoothAdapterState({      success: function(res){       // success            },      fail: function(res) {       // fail       },      complete: function(res) {       // complete      }     })    },    fail: function(res) {        },    complete: function(res) {     // complete    }   })    },    fail: function(res) {     // fail    },    complete: function(res) {     // complete    }   })  }  //zheli})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持VEVB武林网。


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表