小程序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
})
   
   


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