蓝牙RSSI定位入门到精通(3)-指纹法实现
下篇文章蓝牙RSSI定位入门到精通(4)-指纹法实现
https://blog.csdn.net/qq_35651984/article/details/82764334
实现步骤
- 指纹的采集(离线阶段)
- 指纹的处理(数据存储)
- 指纹的使用(在线阶段)
指纹的采集
采集概述
指纹采集,其实是knn中的分类问题,也就是将待测位置划分为小块,每一块为一个类。测试每个类接收到的特征,作为离线数据保存。如图,界面为待测地,将待测地划分测量。
采集实现
每个类,通过手机蓝牙采集20份特征,用平均分获得平均特征,传递给服务器。
将蓝牙名称绑定为信标(实际中应该绑定地址,测试就不介意了哈哈)
并进行初始化。(代码中全局变量应该改成类正规点,测试我就随便写啦)
private ArrayList<String> Arr_rss;//一次的各信标的rssi值private ArrayList<String> Arr_address; //保存信标的地址(name)private ArrayList<Integer> max;//各信标20次的rssi总值private ArrayList<Integer> scanum;//扫描次数,总扫描某信标的次数private String date=null;//用来显示private String send_date=null;//发送给服务器private String string=null;private void init_beacon(){Arr_address=new ArrayList<String>();Arr_address.add("111");//增加信标Arr_address.add("555");Arr_address.add("333");Arr_rss=new ArrayList<String>();//距离由rssi获取Arr_rss.add(null);Arr_rss.add(null);Arr_rss.add(null);max=new ArrayList<Integer>();max.add(0);max.add(0);max.add(0);scanum=new ArrayList<Integer>();scanum.add(0);scanum.add(0);scanum.add(0);}
由于每次广播一个设备只能获得一次ACTION_FOUND,可以在广播接收者中循环取得三个信标的平均rssi,开启线程发送给服务器,结束广播,然后开始广播,连续20次
String action = intent.getAction();if(BluetoothDevice.ACTION_FOUND.equals(action)){BluetoothDevice scanDevice = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);if (scanDevice.getBondState() != BluetoothDevice.BOND_BONDED){for (int i=0;i<Arr_address.size();i++){if (Arr_address.get(i).equals(scanDevice.getName()))//获取到信标{Textview1.setText("查找次数:"+time++);short rssi = intent.getShortExtra(BluetoothDevice.EXTRA_RSSI, Short.MIN_VALUE);Textview1.append("\n 信标:" + scanDevice.getName() );Arr_rss.set(i,String.valueOf(rssi));//存rssimax.set(i,Integer.valueOf(rssi)+max.get(i));//最大rssi加上scanum.set(i,scanum.get(i)+1);//扫描次数加上size_3++;//计时器加上}}}if (size_3>=3)//如果三个信标都扫到了{mBluetoothAdapter.cancelDiscovery();date=date+Arr_rss.get(0)+" "+Arr_rss.get(1)+" "+Arr_rss.get(2)+"*";}}else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){Textview1.append("\n扫描完成");if (size_10++<20&&size_3>=3){size_3=0;mBluetoothAdapter.startDiscovery();}if(size_10==20){// mBluetoothAdapter.cancelDiscovery();Textview1.setText("扫描20次完成");Textview1.append("\n"+date);Textview1.append("\n"+max.get(0));Textview1.append("\n"+max.get(1));Textview1.append("\n"+max.get(2));send_date=string+"&"+max.get(0)/Double.valueOf(scanum.get(0))+"&"+max.get(1)/Double.valueOf(scanum.get(1))+"&"+max.get(2)/Double.valueOf(scanum.get(2));Textview1.append("\n"+send_date+" "+size_10);MyThread myThread=new MyThread(send_date);myThread.start();size_10++;//重置size_3=0;time=0;scanum.set(0,0);scanum.set(1,0);scanum.set(2,0);max.set(0,0);max.set(1,0);max.set(2,0);}}}
线程的代码
public void run(){try {Socket socket = new Socket("43.226.xxx.xxx",8888);OutputStream out = socket.getOutputStream();out.write(string.getBytes());out.flush();out.close();socket.close();}catch (Exception e){e.printStackTrace();}
指纹的处理
服务器端用一个qt程序接收并显示数据,并附上运动轨迹
qt创建套接字,监听后会得到newConnection的信号,在槽函数进行readyRead信号的接收,获得发来的数据。
connect(tcpserver,&QTcpServer::newConnection,[=](){ui->label->setText("建立连接");tcpsocket=tcpserver->nextPendingConnection();//获得套接字QString str=QString("获得连接:%1 获得地址:%2").arg(tcpsocket->peerName()).arg(tcpsocket->peerAddress().toString());ui->label->setText(str);connect(tcpsocket,&QTcpSocket::readyRead,[=](){string=tcpsocket->readAll().data();ui->label->setText(string);
对接收的数据进行处理,文件保存(实际应该用数据库,测试就无所谓啦)
QFile file_out(".\\ku.txt");if(file_out.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Append)){QTextStream textout(&file_out);textout<<string<<endl;}file_out.close();
将获得的数据显示出来,我使用的Qtableview简单显示
qstr_list<<string;model->setItem(timer,0,new QStandardItem(string.mid(0,string.indexOf("&"))));model->item(timer,0)->setForeground(QBrush(QColor(255,0,0)));//设置字符居中model->item(timer,0)->setTextAlignment(Qt::AlignCenter);model->setItem(timer++,1,new QStandardItem(string.mid(string.indexOf("&"))));ui->label->setText("离线阶段完成");}
效果图
下篇中完成指纹的使用
蓝牙RSSI定位入门到精通(3)-指纹法实现相关推荐
- 蓝牙RSSI定位入门到精通(2)--指纹法
下篇地址蓝牙RSSI定位入门到精通(3)-指纹法实现 点击:室内定位主页目录+一维实战+二维实战+安卓惯性导航基础 前言 继上篇文章,由于信号的严重衰减和多径效应,使得三点定位算法得到的坐标精准度太差 ...
- 蓝牙RSSI定位入门到精通(4)-指纹法实现
下篇文章蓝牙RSSI定位入门到精通(5)-卡尔曼滤波 https://blog.csdn.net/qq_35651984/article/details/82793612 指纹的实现 接上篇文章,指纹 ...
- 蓝牙RSSI定位入门到精通(1)---三点定位
下一篇:蓝牙RSSI定位入门到精通(2)–指纹法 点击:室内定位主页目录+一维实战+二维实战+安卓惯性导航基础 蓝牙5.0的发布,降低了功耗,大大提高了定位的准确度和距离,而它的定位–物联网设备又使室 ...
- android 定位蓝牙,Android开发-蓝牙RSSI定位
RSSI(Received Signal Strength Indication)是接收的信号强度指示,用来判定链接质量,利用RSSI信号值可以计算主设备和蓝牙设备的距离信息.通过至少三个设备的RSS ...
- 黑客攻防从入门到精通-手机安全篇
ISBN: 978-7-301-27735-5 作者: 明月工作室 高翔 阅读时间:2017-03-22 页数:344 页 推荐指数:★★★☆☆ 本书用了近三个星期零散看完,感觉并无宣传如此夸张.适合 ...
- 蓝牙室内定位之AOA室内定位技术详解--新导智能
目前,越来越多的商场.停车场.展馆.医院等场所都进行了或行将进行才智化建设,其间室内导航因其寻路导向功能,成为建设首要内容之一.蓝牙室内定位计划因其成本低.布置便利.精度能满足要求等优点,是企业的首选 ...
- Android开发从入门到精通
Android开发从入门到精通 --Android经典教程 目 录 目 录 1 第一章 什么是Android 1 什么是Android - 嵌入式设备编程的历史-第一章(1) 1 开放手机联盟和And ...
- 《iOS移动开发从入门到精通》图书连载一:如果你也想开发一款自己的APP,可以看一下这篇文
前言:互联网+时代给自己多一个选择的机会,尝试开发一款属于自己的APP,绝对是件激动人心的事情!<iOS移动开发从入门到精通>已经上市并和大家见面.从今天起,我会将把图书的部分内容以连载的 ...
- 【组队学习】【28期】数据采集从入门到精通
数据采集从入门到精通 论坛版块: http://datawhale.club/c/team-learning/38-category/38 开源内容: https://github.com/dataw ...
最新文章
- 实时传输协议(RTP)
- ForefrontTMG关于单一的网络适配器限制
- XenApp共享桌面打开文件警告与桌面文件由于Internet文件安全设置无法打开解决办法...
- python 定时器_python 线程之四:定时器(Timer),非阻塞
- eplan安装提示没有安装许可语言_CAD和EPLAN!电气制图你会选择哪个?
- springboot filter_SpringBoot(二) :web综合开发
- 链表C++ | 根据 位置 / 值 删除节点_2
- 数据科学和人工智能技术笔记 九、模型验证
- python连接mysql用哪个模块_pymysql模块使用---Python连接MySQL数据库
- bean type not found
- vspython版本控制_python使用git进行版本控制1
- java幸运抽奖项目
- c语言 设置线程优先级,C# Priority:多线程优先级设置
- python 飞翔的小鸟
- 从零开始开发一个全栈Web应用实录
- mini2440 linux驱动程序,mini2440的led的Linux驱动程序
- 转:各种文本格式转换的网站
- 在阿里(02):阿里入职记
- 阿里2014校园招聘 笔试题
- 支持html邮件,HTML邮件兼容问题与解决方案