小程序ibeacon三点定位

空余时间简单写了一个微信小程序 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
})
   
   


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章