微信小程序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

})

以上是 微信小程序ibeacon三点定位详解 的全部内容, 来源链接: utcz.com/z/328810.html

回到顶部