Android 蓝牙防丢(二)

本文章没有完善,请勿 转载,谢谢。Demo  工程完善后会传到我的github

package com.bipbip.ble;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import android.util.Log;

/**
 * 
 * @author Administrator
 */
public class BlePreventLostCore {
 private static String TAG=BlePreventLostCore.class.getSimpleName();
 private final  static double deviateBaseFlag=0.2; //
 private final  static double WCF=0.5;         //Weight Compensation Flag,权重补偿因子
 
 private static Map<String,List<Integer>> sacnedBleDevicesData;
 /**
  * 去除采集到数据中的脏值
  * deviateBaseFlag 为基准的脏值偏移标志,如果长度比较大的话,可以适当的加大             
  * 先简单的以算术平均数作为参照,大于average 的deviateBaseFlag*average 就判断是脏值。
  * 
  * 
  */
 public static void clearDigest() {
//  double deviateFlag=0.2**……&&N; //
  Map<String,Double> sAverageSSID=new HashMap<>();   //简单算术平均数
  Set<String> ks =sacnedBleDevicesData.keySet();
  
  //求对应手表的算术平均数。
  for(String key : ks ){
   double average=0.0;   
   List<Integer> ssidList=sacnedBleDevicesData.get(key);
   int size=sacnedBleDevicesData.get(key).size();
   for(int i=0;i<size;i++){
    average=average+ssidList.get(i);
   }   
   average=(double)average/size;
   sAverageSSID.put(key, average);  
  }
  
  //去除脏值。
  for(String key : ks ){
   double average=0.0;   
   List<Integer> ssidList=sacnedBleDevicesData.get(key);
   int size=sacnedBleDevicesData.get(key).size();
   double averageTemp=sAverageSSID.get(key);
   for(int i=0;i<size;i++){
//    average=average+ssidList.get(i);
    if(Math.abs(ssidList.get(i)-averageTemp) >  deviateBaseFlag*averageTemp){
     ssidList.remove(i);
    }
   }   
  }
  
 }
 
 /**
  * ssid 对用的权重分布[... , ...]
  * 
  * @return
  */
 public static Map<String,List<Double>> getWeghtCompensationMap(){
  Map<String,List<Double>> weghtCompensationDatas =  new HashMap<String,List<Double>>(); //权数分布
//  Map<String,Double>  weghtCompensationDecreasing; //权重递减因子
  //1.初始化权数分布
  Set<String> ks =sacnedBleDevicesData.keySet();
  for(String key : ks ){
   final int size=sacnedBleDevicesData.get(key).size();
   List<Double> weghtCompDataList=new ArrayList<Double>(size-1);
   //1.权重分布的前半部分初始化
   for(int i=0;i<size;i++){
                double decreasing=WCF-WCF*2*(i+1)/size;
    if(decreasing>0&&i<size/2){
     weghtCompDataList.add(i, decreasing);
    }else{
     weghtCompDataList.add(i, (double) 0);
    }
   }
   
   //2.权重分布的后半部分初始化
   for(int j=size-1;j>size/2;j--){
    double temp=weghtCompDataList.get(size-j-1);
    weghtCompDataList.set(j,temp);
   }
   //3.权重分布的 实际处理
   for(int i=0;i<size/2;i++){
    weghtCompDataList.set(i, (1-weghtCompDataList.get(i))/size);
   }
   for(int j=size-1;j>size/2;j--){
    weghtCompDataList.set(j, (1+weghtCompDataList.get(j))/size);
   }
   
   //4.权重分布的 中位数实际处理
   if(size%2==0){
    weghtCompDataList.set(size/2,1.0/size);
   }else{
    weghtCompDataList.set(size/2, 1.0/size);
    weghtCompDataList.set(size/2-1, 1.0/size);
   }
   
   //5.权重分布测试,相加应该无限接近    100/100=1
   double test=0;
   for(int s=0;s<size;s++){
    test=test+weghtCompDataList.get(s);
   }
   weghtCompensationDatas.put(key, weghtCompDataList);
  }//权重分布完成
  
  return weghtCompensationDatas;
  
 }
 
 
 /**
  * 时间越后,权重越大
  * 
  * @param sacnedBleDD
  * @return
  */
 public static Map<String,Double> getDeviceState(final Map<String,List<Integer>> sacnedBleDD){
  sacnedBleDevicesData=sacnedBleDD;
  clearDigest();
  
  Map<String,List<Double>> weightCompensation=getWeghtCompensationMap();      //权数分布因子 
  Log.e(TAG,"  "+weightCompensation);
  
  Map<String,Double> averageSSID=new HashMap<>();
  Set<String> ks =sacnedBleDevicesData.keySet();
  for(String key : ks ){
   double average=0.0;
   List<Double> weghtCompDataList=weightCompensation.get(key);
   List<Integer> ssidList=sacnedBleDevicesData.get(key);
   for(int i=0;i<weghtCompDataList.size();i++){
    average=average+weghtCompDataList.get(i)*ssidList.get(i);
   }   
   
   averageSSID.put(key, average);  
   //bingo.
  }
  return averageSSID;
 }
}
时间: 2024-07-30 13:44:45

Android 蓝牙防丢(二)的相关文章

[yueqian_scut]蓝牙防丢器原理、实现与Android BLE接口编程

本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与Android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内部源码实现,笔者以后再详细剖析.但要求读者对BLE协议有一定的认识,如GAP.GATTprofile在BLE中的角色和作用,如何使用Service.Characteristic等. 一.蓝牙防丢器原理和产品需求 蓝牙防丢器的核心原理是根据接收到的蓝牙设备端的无线信号强度(RSSI)来估算距离.其计算

[智能硬件] 1、三分钟看懂智能硬件原理——蓝牙防丢器制作教程(包括手机应用)

1 什么是智能蓝牙防丢器 所谓智能蓝牙(Smart Bluetooth)防丢器,是采用蓝牙技术专门为智能手机设计的防丢器.其工作原理主要是通过距离变化来判断物品是否还控制在你的安全范围.主要适用于手机.钱包.钥匙.行李等贵重物品的防丢,也可用于防止儿童或宠物的走失 .[请看正版请百度:beautifulzzzz(看楼主博客园官方博客,享高质量生活)嘻嘻!!!] 图 1-1 蓝牙防丢器应用领域 2 蓝牙防丢器的主要构造 目前比较成熟的产品一般是采用蓝牙4.0技术,具有低功耗.双向防丢.自动报警等优

Android APP压力测试(二)之Monkey信息自动收集脚本

Android APP压力测试(二) 之Monkey信息自动收集脚本 前言: 上一篇Monkey介绍基本搬抄官方介绍,主要是为了自己查阅方便.本文重点介绍我在进行Monkey时如何自动收集相关信息,主要收集Monkey测试日志.手机日志.手机屏幕截图.测试手机信息,自动按次按时间点保存信息.只需轻轻一点,腾出手腾出脑想干吗干吗,执行结束应该有信息的都有收集,一定程序提升了效率,节约了时间.可以偷空看看美图.聊天扯淡...哦不,是学习提高审美观,沟通交流增进同事情感... 转载请注明出处:Find

android产品研发(二十一)--&gt;UI优化

转载请标明出处:一片枫叶的专栏 上一篇文章中我们讲解了android产品研发过程中的代码Review.通过代码Review能够提高产品质量,增强团队成员之间的沟通,提高开发效率,所以良好的产品开发迭代过程中,代码Review是一个必不可少的步骤.那么如何进行代码Review呢?我们主要讲解了团队成员之间的代码Review,代码lint检查,开发规范等方面的知识点,更多关于代码Review相关的知识可参考我的:android产品研发(二十)–>代码Review 本文我们将讲解一下android U

完美解决Android使用Zxing扫描二维码改成竖屏后,后面的预览画面出现了拉伸,扭曲的情况

完美解决解决Android使用Zxing扫描二维码改成竖屏后,后面的预览画面出现了拉伸,扭曲的情况 第一步:找到com.zxing.camera包下的CameraConfigurationManager.java文件中的void initFromCameraParameters(Camera camera)方法 第二步:在 Log.d(TAG, "Screen resolution: " + screenResolution);后加上如下的代码 Point screenResoluti

从零开始学android&lt;RatingBar评分组件.二十三.&gt;

如果现在用户要对某个应用程序打分往往会使用图所示的组件,通过选择的"五角星"的个数来决定最终的打分成绩 这样的功能在Android之中,可以使用RatingBar组件实现,使用此组件可以方便用户的输入,而且很直观,RatingBar类的定义结构如下: java.lang.Object ? android.view.View ? android.widget.ProgressBar ? android.widget.AbsSeekBar ? android.widget.RatingBa

Android学习路线(二十)运用Fragment构建动态UI

要在Android系统上创建一个动态或者多面板的用户界面,你需要将UI组件以及activity行为封装成模块,让它能够在你的activity中灵活地切换显示与隐藏.你可以使用Fragment类来创建这些模块,它们能够表现得有些像嵌套的activity,它们定义着自己的布局,管理自己的生命周期. 当一个fragment指定了它自己的布局,它可以在activity中和其他的fragment配置为不同的组合,这样就能够为不同的屏幕尺寸来修改你的布局配置(在小屏幕上一次展现一个fragment,而在大屏

Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

你可以把fragment看成是activity的模块化部分,它拥有自己的生命周期,接受它自己的输入事件,你可以在activity运行时添加或者删除它(有点像是一个"子activity",你可以在不同的activity中重用它).本课将向你展示如何使用Support Libaray继承 Fragment 类来让你的应用能够兼容正在运行Android 1.6的设备. 提示: 如果你决定你的应用需求的最低API级别是11或者更高,那么你不需要使用Support Library,你可以直接使用

Android bluetooth介绍(二): android 蓝牙代码架构及其uart 到rfcomm流程

关键词:蓝牙blueZ  UART  HCI_UART H4  HCI  L2CAP RFCOMM  版本:基于android4.2之前版本 bluez内核:linux/linux3.08系统:android/android4.1.3.4作者:xubin341719(欢迎转载,请注明作者,请尊重版权谢谢)欢迎指正错误,共同学习.共同进步!!一.Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架) Android的蓝牙系统,自下而上包括以下一些