wifi定位实验报告.docx
- 文档编号:24297097
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:16
- 大小:297.68KB
wifi定位实验报告.docx
《wifi定位实验报告.docx》由会员分享,可在线阅读,更多相关《wifi定位实验报告.docx(16页珍藏版)》请在冰豆网上搜索。
wifi定位实验报告
定位实验
题目:
基于WIFI位置指纹的室内定位实验
成员:
2012年12月
一、实验题目
实验题目
基于Wifi位置指纹的室内定位实验
实验要求
学习android平台使用、android编程、android环境下wifi设备查看操作。
实验内容
利用最少数目的wifi热点设备,能够实时地对手机进行定位。
2、实验目的
目前全球定位系统(GPS,GlobalPositioningSystem)是获取室外环境位置信息通过实施项目的最常用方式。
但由于卫星信号容易受到各种障碍物遮挡,GPS/APGS等卫星定位技术并不适用于室内或高楼林立的场合,目前无线室内定位技术迅速发展,已成为GPS的有力补充。
了解智能手机如何利用Wifi热点设备信号强度进行室内定位。
3、实验原理
1.Android系统架构简介
Android系统架构见图,它建立于Linux内核之上,包含了各种设备驱动和管理模块,囊括了非常齐全的类库和框架,包括轻量级数据库SQLite、浏览器Webkit等。
整个系统建立在Dalvik虚拟机上,应用程序使用Java语言编写。
Android系统提供了丰富的框架(活
动管理、位置管理等)来管理系统的软、硬件资源,整合了常用的应用程序(联系人、电话本等),并开放了很全面的API供用户使用,整个平台具有良好的开放性和扩展性。
2.采用基于射频指纹的定位方法
移动终端需要获得周围AP的RSSI指纹特征,Android系统提供的接口可以很方便地实现这一功能。
3.定位算法
由于室内环境复杂,WiFi无线信号具有较强的时变无线信号传播衰减模型难以很好的表征距离与信号强度间的映射关系,采用基于射频指纹匹配定位方法,它具有较好的定位鲁棒性。
指纹匹配方式定位算法建立在实验数据基础上,它主要包括离线训练和在线定位两个阶段,其中离线训练阶段的任务是建立射频信号强度向量和客户端位置间的一一对应关系,形成一个指纹库(radiomap),定位阶段则使用实时采集的信号强度向量去匹配训练阶段构建的指纹库,从而获得目标的位置估计。
4.本次实验所采用的基本原理和基本思想如下:
Ø当手机程序初次运行时,会创建一个数据库,数据库中包含两个表,一个记录用户所采集的地点信息,另一个表记录每个之前所记录的地点信息所对应的wifi信息,为一对多的关系。
Ø手持手机设备采集指纹信息,即地点信息,指纹信息会存入之前创建的数据库中,即把输入的地点名称录入表1中,并对此地点的wifi进行扫描,将满足一定要求的wifi信息,每个wifiSSID+地点名称作为一个记录存进表2中。
采集的指纹信息越多,定位就会越准确。
Ø定位时,先扫描得到所在地点的wifi信息列表,然后与数据库中每一个地点所拥有的wifi信息进行匹配,若待定位地点的wifi信息绝大部分都在数据库中某一地点的wifi信息列表中(允许存在一定的误差),则可以认为当前地点就是数据库中的那一个地点,于是输出那一个地点的名称,完成定位。
4、实验流程
1.首先在手机上面打开应用程序:
如图1
图1
2.然后添加指纹信息,运行效果图如下图2和图3:
图2图3
重复此过程,直到数据库中有一定的数量的指纹信息
3.进入到查询界面,如图4:
图4
4.查询当前所在的位置,结果如图5所示:
图5
5、个人工作及总结
本次实验我主要负责程序中关于指纹数据库初始化模块和查询用户当前位置模块。
Ø在指纹数据库初始化模块中,主要任务是建立如下结构的表1:
wifi和表2:
location:
表一:
ID
Wifi_SSID
Location_ID
表二:
Location_ID
Location_name
其中表一和表二通过Location_ID进行关联,建表的目的是存储location信息及其对应的wifi列表信息,一个location信息对应多个wifi信息。
Ø在查询用户当前位置模块中,主要是进行待定位地点wifi列表信息与数据库中已经存在地点的wifi列表信息进行匹配。
在此过程中用一个数组wificount[]保存匹配的wifi个数,wificount[i]代表待定位地点wifi列表信息与数据库表二中location_ID为i的地点所拥有的wifi列表信息匹配的wifi个数。
最初实验只有两者个数完全一样时才输出此地点,但是在实际操作运行时总是没有匹配的信息输出。
后来经过分析和查相关的资料,发现生活中很多wifi信号不是很稳定,并且wifi信号受外界环境的影响较大,手机就算是在同一地点所收到的wifi信号变化也会很大,于是考虑允许wificount[i]有一定的误差,但是多少范围内的误差即能尽大可能的不影响定位的误差,又可以实现定位?
后来经过测试,当wificount[i]左右变化不超过3的时候可以满足一般性要求,实现定位。
通过本次实验,知道了wifi定位的基本原理,并且在实际中给予实现;熟悉了安卓开发的一般性步骤,提升了自己的能力。
同时发现,此安卓程序存在诸多问题和可以改进的地方,如采集指纹信息的时候必须人为操作,可以设置一个定时器,周期性的进行采集。
6、附录:
实验代码
1.程序运行主入口:
//程序运行的主入口
packagecom.example.w4;
importjava.util.List;
import.wifi.ScanResult;
import.wifi.WifiInfo;
import.wifi.WifiManager;
importandroid.os.Bundle;
importandroid.app.Activity;
importandroid.content.ContentValues;
importandroid.content.Intent;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.view.Menu;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.TextView;
importandroid.widget.Toast;
publicclassMainActivityextendsActivity{
publicstaticintlocationnum=0;
publicstaticintwifinum[]=newint[100];
publicTextViewtext1,text2,text3,text4,text5;
@Override
//创建
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DBHelpersource=newDBHelper(this);
SQLiteDatabasedb=source.getWritableDatabase();
Buttonlocationaddbutton=(Button)findViewById(R.id.locationaddbutton);
Buttonsearchbutton=(Button)findViewById(R.id.searchbutton);
locationaddbutton.setOnClickListener(newAddButtonClickListener());
searchbutton.setOnClickListener(newSearchButtonClickListener());
text1=(TextView)findViewById(R.id.text1);
text1.setText(R.string.hello_world);
}
//“输入当前地点的位置”按钮的动作监听器
publicclassAddButtonClickListenerimplementsOnClickListener{
@Override
publicvoidonClick(Viewv){
locationnum++;
Intentintent=newIntent(MainActivity.this,Add.class);
startActivity(intent);
}
}
//“查询当前所在的位置”按钮的动作监听器
publicclassSearchButtonClickListenerimplementsOnClickListener{
@Override
publicvoidonClick(Viewv){
Intentintent=newIntent(MainActivity.this,Search.class);
startActivity(intent);
}
}
}
2.指纹数据库初始化模块:
//创建一个空的数据库,初始化数据库
packagecom.example.w4;
importandroid.content.Context;
importandroid.database.DatabaseErrorHandler;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
importandroid.widget.Toast;
publicclassDBHelperextendsSQLiteOpenHelper{
privatestaticfinalintDATABASE_VERSION=1;
privatestaticfinalStringDATABASE_NAME="wifilocation.db";
privateContextm_context;
privatestaticfinalStringWIFI_CREATE_DDL="CREATETABLEWIFI(_IDINTERGERPRIMARYKEY,WIFI_SSIDTEXT,WIFI_LEVELINTEGER,WIFI_LOCATIONINTERGER);";
privatestaticfinalStringLOCATION_CREATE_DDL="CREATETABLELOCATION(_IDINTERGERPRIMARYKEY,LOCATION_DESCRIPTIONTEXT);";
//Wifi表,地点id,wifi的ssid,level,查询时按照groupby地点id,
//location表地点id,地点描述,两表通过id建立联系
privatestaticfinalStringWIFI_DELETE_DDL="DROPTABLEIFEXISTSWIFI;";
privatestaticfinalStringLOCATION_DELETE_DDL="DROPTABLEIFEXISTSLOCATION";
publicDBHelper(Contextcontext){//对象的构造函数
super(context,DATABASE_NAME,null,DATABASE_VERSION);
m_context=context;//TODOAuto-generatedconstructorstub
}
@Override
//执行SQL语句以创建表
publicvoidonCreate(SQLiteDatabasedb){
Toast.makeText(m_context,"creatdb",Toast.LENGTH_LONG).show();//TODOAuto-generatedmethodstub
db.execSQL(WIFI_CREATE_DDL);
db.execSQL(LOCATION_CREATE_DDL);
}
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intlolVersion,intnewVersion){//两个表的更新,当version变化时会更新(调试时用)
Toast.makeText(m_context,"upgradedb",Toast.LENGTH_LONG).show();
db.execSQL(WIFI_DELETE_DDL);
db.execSQL(WIFI_CREATE_DDL);
db.execSQL(LOCATION_DELETE_DDL);
db.execSQL(LOCATION_CREATE_DDL);
}
}
3.采集并添加指纹信息模块:
//增加指纹库,往数据库中增加指纹信息
packagecom.example.w4;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.ContentValues;
importandroid.database.sqlite.SQLiteDatabase;
import.wifi.ScanResult;
import.wifi.WifiManager;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.EditText;
importandroid.widget.Toast;
publicclassAddextendsActivity{
publicstaticStringBuffersave;//保存的location信息都在其中
//“输入当前地点的位置”按钮动作监听器
publicclassSubmitListenerimplementsOnClickListener{
@Override
//点击按钮之后将wifiSSID信息存入指纹数据库中
publicvoidonClick(Viewv){
EditTextdesc=(EditText)(Add.this).findViewById(R.id.desc);
DBHelperhelper=newDBHelper(Add.this);
SQLiteDatabasedb=helper.getWritableDatabase();
WifiManagerwifimanager=(WifiManager)getSystemService(WIFI_SERVICE);
wifimanager.startScan();
List
inti=0;
String[]ssid=newString[25];
for(ScanResultscanResult:
scanResults){
//信息添加到数据库中
ContentValuesargs=newContentValues();
if(wifimanager.calculateSignalLevel(scanResult.level,100)>20){//这里将level>20的认为是比较稳定的wifi站点
args.put("WIFI_SSID",scanResult.SSID.toString());
longrowid=db.insert("WIFI",null,args);
args.put("WIFI_LEVEL",wifimanager.calculateSignalLevel(scanResult.level,100));
longrowid2=db.insert("WIFI",null,args);
i++;
}
}
Toast.makeText(Add.this,"Onerecordinsert,thereare"+i+"wifiathere",Toast.LENGTH_LONG).show();
MainActivity.wifinum[MainActivity.locationnum]=i;//几号地点有几个wifi站点
db.close();
}
}
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.add);
ButtonsubmitButton=(Button)findViewById(R.id.submit);
submitButton.setOnClickListener(newSubmitListener());
}
}
4.查询用户当前位置模块:
//查询用户当前位置
packagecom.example.w4;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
import.wifi.ScanResult;
import.wifi.WifiManager;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.Toast;
publicclassSearchextendsActivity{
publicint[]wificount=newint[100];//与数据库中数据相匹配wifi的数量
publicint[]levelcount=newint[100];
//“查询当前所在的位置”按钮动作监听器
publicclassSearchListenerimplementsOnClickListener{
privateStringsqllistarray;
@Override
publicvoidonClick(Viewv){
DBHelperhelper=newDBHelper(Search.this);
SQLiteDatabasedb=helper.getReadableDatabase();//db是之前创建和输入指纹信息的数据库
WifiManagerwifimanager=(WifiManager)getSystemService(WIFI_SERVICE);
List
List
for(inti=1;i<=MainActivity.locationnum;i++){
Cursorcursor=db.query("WIFI",newString[]{"_ID","WIFI_SSID","WIFI_LEVEL","WIFI_LOCATION"},"WHEREWIFI_LOCATION=1",null,null,null,null);
try{
if(cursor.moveToFirst()){
do{
Stringsqlresult=cursor.getString
(1);//如果结果出错尝试修改
sqllist.add(sqlresult);
}while(cursor.moveToNext());//对数据库中某一个location中wifi信息进行遍历,然后加入到sqlresult变量中
}
}finally{
cursor.close();
}
sqllistarray=sqllist.toString();
db.close();
wifimanager.startScan();
for(ScanResultscanResult:
scanResults){//对扫描到每一个wifi信息,如果存在于sqlresult中,wifilocation变量加一
if(sqllistarray.indexOf(scanResult.SSID)!
=-1)
wificount[i]++;//第i个location有这些个wifi数与所存地点的wifi匹配
if(wificount[i]>=MainActivity.wifinum[i]-3&&wificount[i]<=MainActivity.wifinum[i]+3)//如果匹配的wifi数量在一定范围之内,则输出对应的location信息
{Toast.makeText(Search.this,"Thelocationid="+i,Toast.LENGTH_LONG).show();
break;
}
}
}
}
}
protecte
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- wifi 定位 实验 报告