Android 蓝牙防丢实现(一)

 

本文章没有完善,请勿 转载,谢谢。

 Demo 地址:https://play.google.com/store/apps/details?id=com.bipbip.ble

Android BLE蓝牙防丢功能设计文档

摘要 蓝牙防丢,原理比较简单,实现不是那么简单。在预定的间隔时间内不断的扫描周围的蓝牙设备,读取对应设备的信号强度值存储下来SSID【X1,X2...,Xn-1,Xn】统计分析,去除脏值,然后求加权算术平均数。根据距离和信号强度值的对应关系判断设备之间的距离。

一,概念说明

求平均一般有两种:简单算术平均数arithematic mean和加权平均数weighted mean。简单算术平均计算简单没有考虑到波动和强度指标;一般的在工程领域使用加权平均比较多,加权平均数的公式定义如下:

  

  其中: ----代表算术平均数,x 代表各单位标志值(变量值),f 代表各组单位数(项数)。

  运用条件:统计资料分组时我们不难得出如下结论:平均数水平高低受两个因素的影响(当然数据统计分析都是要在比较大规模的数据基础上进行,否则意义不大):

  (1)受各组变量值( x )大小的影响

  (2)受各组权数(f)大小的影响。(绝对权数表现为次数、频数,相对权数表现为频率)。

 

二,计算步骤

 

(1)采集数据,采集固定间隔时间内的设备的信号强度值数值SSID【X1,X2...,Xn-1,Xn】;

(2)去除脏值,去除数组中的脏值;

(3)求出信号强度值数值SSID【X1,X2...,Xn-1,Xn】对应的权数分布【F1,F2, ... Fn-1,Fn】

 ( 4 ) 处理异常情况(比如某个设备采集到的SSID数组长度太少,距离越界后反馈确认机制)

三,步骤详解

去除脏值Digest,采集固定间隔时间内的设备的信号强度值数值SSID【X1,X2...,Xn-1,Xn】后难免会有一些脏值扰乱最终结果。首先要确定脏值的判断标准,在这里脏值的判断标准是:如果SSID数组中的一个值偏离SSID数组的简单平均数arithematic mean大于DeviateFlag(这个标记可以根据程序的实际情况调整,在这里取值20%),那么我们就判断这个值是脏值。

求权数分布,不同的SSID数值对应的权数在这里和时间有关,在这里时间越后,权重会越高;假设权值分布为F【F1,F2, ... ,Fn-1,Fn】。那么F1+F2+ ... +Fn-1+Fn=1=100/100;这里要定义一个值权重补偿因子WCF(Weight Compensation Flag)=50/100,简写WCF(补偿值有点大哦,感觉这个数组也应和SSID的数组长度N有关,后期优化);那么权重补偿递减因子WCD(Decreasing)就是:WCD=WCF/N/2;(N>2  有效)

那么Fn的分布就是:

【1-D1/N,1-D2/n, ... 1-D(n/2)/n, ... , 1+D2/n, 1+D1/N】。-----------------------------------------------------------------------------------------------------

                                                                                  |权重补偿因子:WCF

那么首先要求Dn【D1,D2,... D(n/2), ... , .....】的分布;--|

                                                                                   | 权重补偿递减因子:WCD

if(WCF-WCF*2*i/N>0&&i<N/2)那就一直分布下去..........

处理Dn的长度和Fn的长度(其实是SSID的长度),求出Fn的分布后;

那么weighted mean=SSID对应的分布*Fn对应分布的累加和

 

Android Demo实现见第二期。不太会编辑数学公式,还是用源码说明吧。Demo见google play.

 

 

 

附录,参考文档

http://wiki.mbalib.com/wiki/平均数

http://www.stat.nuk.edu.tw/prost/content2/statics_4.htm

http://wiki.mbalib.com/wiki/算术平均数

你可能感兴趣的:(android,蓝牙,防丢)