您的位置:首页 > 移动开发 > Android开发

WiFi签到设计

2016-11-18 18:43 246 查看
一、 关于WiFi

在Android中对WiFi操作主要应用以下几个类和接口:

1、 ScanResult

主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,身份认证,频率,信号强度等信息。其实就是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。

2、 WifiConfiguration

Wifi网络的配置,包括安全设置等,在我们连通一个wifi 接入点的时候,需要获取到的一些信息。主要包含四个属性:

BSSID:BSS是一种特殊的Ad-hocLAN(一种支持点对点访问的无线网络应用模式)的应用,一个无线网络至少由一个连接到有线网络的AP和若干无线工作站组成,这种配置称为一个基本服务装置。一群计算机设定相同的 BSS名称,即可自成一个group,而此BSS名称,即所谓BSSID。通常,手机WLAN中,bssid其实就是无线路由的MAC地址。

networkid:网络ID。

PreSharedKey:无线网络的安全认证模式。

SSID:SSID(Service SetIdentif)用于标识无线局域网,SSID不同的无线网络是无法进行互访的。

3、 WifiInfo

wifi无线连接的描述,包括(接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息)。这里简单介绍一下WifiManager中常用的方法:

getSSID()
获得SSID(热点名称)
getBSSID()
获取BSSID
getDetailedStateOf()
获取客户端的连通性
getHiddenSSID()
获得SSID
是否被隐藏

getIpAddress()
获取IP
地址

getLinkSpeed()
获得连接的速度
getMacAddress()
获得Mac
地址

getRssi()
获得802.11n
网络的信号

4、 WifiManager

wifi连接统一管理类,获取WIFI网卡的状态(WIFI网卡的状态是由一系列的整形常量来表示的):

WIFI_STATE_DISABLING = 0
WIFI网卡正在关闭
WIFI_STATE_DISABLED = 1
WIFI网卡不可用
WIFI_STATE_ENABLING = 2
WIFI网正在打开 (WIFI启动需要一段时间)
WIFI_STATE_ENABLED = 3
WIFI网卡可用
WIFI_STATE_UNKNOWN = 4
未知网卡状态
WIFI_AP_STATE_DISABLING = 10
WIFI热点正在关闭
WIFI_AP_STATE_DISABLED = 11
WIFI热点不可用
WIFI_AP_STATE_ENABLING = 12
WIFI热点正在打开
WIFI_AP_STATE_ENABLED = 13
WIFI热点可用
二、 关于WiFi签到的策略

策略1、直连WiFi

最为最简单的签到方式,就是指定某个WiFi信号,当签到人连上此WiFi时,将其记录。

策略2、测距

基于WiFi室内定位的思路,通过测距来计算签到人与WiFi热点之间的距离,当数值处于某个合理区间内,则将其记录,视为签到成功。此方法更符合我们的用意。

测距方式包括TOA(Time ofArrival)、TDOA(Time Difference of Arrival)、AOA(Angle ofArrival)以及RSSI(Recieved Signal Strength Index)。TOA是利用接收机接收信号和AP发射信号之间的时间差来确定两者之间的距离,基本原理是在平面上如果能同时接收到三个以上的AP点信号,并且这些AP点位置已知的情况下,就可以利用三角测量的方式,唯一地确定出接收机的位置;类似地,TDOA也是基于三角测量,只不过它是基于接收机到两个AP点的距离差来进行定位,从数学上可以知道,如果接收点到AP1和AP2的距离差已知,那么接收点的平面位置只能是双曲线的一端,如果有AP2和AP3的距离差,那么两条曲线的交点就是接收机实际的位置;虽然TOA和TDOA的定位精度非常高,但是可以看出,这两种方式对于时间同步的要求非常高,由于电磁波的传播速度很快,时间上哪怕是微秒级的误差也会导致测距的几十米左右的误差,并最终影响定位精度,因此对设备的要求也比较高;而RSSI接收的是信号强度,然后再根据一定的模型将信号强度转换成距离,完成测距,常见的是利用WIFI信号来进行RSSI测距。

三、 关于RSSI及其距离估计算法

1、 传统RSSI距离估计算法

无线信号都有一个信号强度(RSSI),接收信号强度RSSI是传输功率衰减和传输距离(收发者之间的距离)的函数,可以用公式:

RSSI = - (10nlgD+A)
表示。

则有:

D =10^((abs(RSSI)-A)/(10*n)
其中D是计算距离,RSSI是信号强度,A为发射端和接收端相隔1米时的信号强度的绝对值,n是环境衰减因子。对于不同的热点A的值是不一样的,而且对于同是1米的情况下,环境对于信号强度也是有影响的。n是环境衰减因子,自然跟环境有关。n一般取经验值。

2、 干扰因素

式中的A和n的数值决定了接收信号强度和信号传输距离的关系。由于在不同环境中参考节点的信号衰减与距离关系是变化的,因此在不同环境中n的值再采用经验值会导致一定的误差。

3、 优化改进

由于受到周围环境的各种其它因素的干扰,接收机接收的信号中可能含有随机性的误差,因此在进行处理之前,需要先对这些信号进行滤波处理,而滤波的方法有很多,目前主要的方法有均值滤波、高斯滤波、修正加权滤波及卡尔曼滤波。另外,在利用RSSI的方式进行测距时,接收机接收的是信号的强度,如何把信号强度转化为实际的距离值,就需要用到相应的模型,目前的测距模型一般可分为经验模型和确定性模型,经验模型主要是根据实测数据来建立模型和参数回归,而确定性模型是根据信号的特性,选用一定的数学模型来拟合,常见的确定性模型包括Ericsson多重断点模型、对数距离路径损耗模型、衰减因子模型和K-M模型。

对此我采取了加权滤波的方式来剔除一些信号采集以及距离计算上的干扰。参考方法详见网址:http://www.doc88.com/p-9975710682799.html

四、 算法尝试与实际困难

基于上述方法,设计了一个demo(代码见博文:简单的WiFi测距demo)进行试验,通过连接的当前WiFi热点信号强度估算距离。结果如下:



这是在距离热点1米左右距离进行采集计算的结果,误差0.2米左右,还可以接受。但是当多次采集、较大距离采集时则会出现衰减因子因为信号强度不稳定且采集次数不够存在较大偶然性导致计算数值不准确,反过来致使计算的距离出现较大误差的现象。这给此方法的应用带来了困难。也不排除因为采用终端连接WiFi的方式导致终端与热点之间信号较弱时,热点增大功率保持信号的影响因素。因此还需要采用终端不连接WiFi的方式再进行一次实验。除此以外,在实际应用中受制于环境因素、终端功率、芯片平台不同,甚至是WiFi天线的厂商不同,使得环境衰减因子n和发射端和接收端相隔1米时的信号强度的绝对值A都会不同,对估算距离产生不同程度影响,这是造成在应用过程中情况复杂、通用性低的重要原因。

五、最终签到方案

经过与导师及同事的讨论分析,我决定采用这样的一种签到方案:

1、收集公司WiFi热点mac地址建立列表。

2、在终端不连接WiFi热点的情况下,应用通过后台去扫描附近热点,当存在之前采集建立WiFi热点列表中的mac地址时(可能多个),选择其中信号强度最大的WiFi热点,通过信号强度估算终端与热点之间的距离,当处于某合理距离区间时,则将其终端信息进行记录,视为一次有效的签到,存入数据库。

3、否则,估算距离超出合理区间或不存在之前采集建立WiFi热点列表中的mac地址或存在但是信号强度均低于某个阈值时都不算做打卡有效,不进行记录,直到存在有效打卡条件时才进行记录。

基于这样的一种思路,我将在下周进行demo的开发工作和后续的机制完善工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android WiFi 签到 RSSI 测距