Wifi 定位原理及 iOS Wifi 列表获取

Wifi 定位原理及 iOS Wifi 列表获取

  对于大家来说,Wifi 应该是一个很熟悉的词了,我们每天都可能在使用 Wifi 热点。Wifi 除了能给我们提供热点之外同时还有定位的作用, 现在移动设备的对用户的隐私保护是越来越严格了,就如定位功能,必须要经过设备用户的授权才能使用 Location 给这台设备定位。这些严格的隐私政策对用户起到到保护作用,但对开发人员却是一种阻碍,在产品强需求的情况下用户是会授权的,如地图类应用,但是另外一些没有对定位强需求的产品,用户可能就不会给你授权了,这是我们可以考虑下 Wifi 定位了。

Wifi 定位原理

  当我们使用手机扫面 Wifi 的时候,其实就可以定位到这台手机的位置信息了。每个 Wifi 路由开启后,都会不停的往四周发射信号,我们把 Wifi 路由想象成太阳以某种频度不停的往周围发射电磁波,电磁波会因距离的削弱,同时也会因为物体阻挡而削弱。例子就是我们在离 Wifi 路由器同样远的位置,有些地方信号强度高有些地方信号强度低。路由同时也叫 Wifi 热点(或者 Wifi AP:Access Point)。每一个 Wifi 路由器都会有一个 BSSID,很多人都管这个 BSSID 叫 MAC 地址(其实 BSSID 并不是 MAC 地址),BSSID 设定了一般就不会在变也不会重复,也就意味着是全球唯一的,这是路由制造的规则,既然有规则那么就会有不遵守规则的人,文章结尾会介绍不遵守规则的人是如何害人害己的。

  刚才提到的 BSSID,在 Wifi 路由器的发射中是可以检测到的,同时 Wifi 路由信号还伴随着,SSID(路由器的名称:如XX的Wifi)、signalStrength(手机接收到Wifi的信号强度)及其它信息。看到这里你应该知道如何使用Wifi定位的了,条件:唯一不变的BSSID 和 手机到路由器的信号强度。思路:Wifi 信号是有范围的,我们假设这个范围就是10米为半径的一个圆(实际情况根据Wifi路由厂商和路由器周围环境而定),我们去采集一些Wifi热点回来,某家水果店的 Wifi、某家餐馆的 Wifi 等等,我们自己去采集的我们肯定知道他们的具体位置,及刚才提到的 Wifi 中的信息:BSSID、SSID、signalStrength,再把他们存入数据库,采集的人可以很多:专业采集人员、出租车司机、快递员等等,他们经常穿梭于大街小巷,其实我们每个人都是Wifi数据库的采集人员,我们的手机厂商每天都在默默的采集着我们的位置信息,iPhone手机系统设置里就可以看到你今天去哪了,你的Wifi连接过哪些设备也是知道的。时间越久Wifi数据库信息越丰富,最终会发现每个BSSID会对应多个SSID和signalStrength,因为SSID是可以修改的,signalStrength是由于在这个Wifi热点的周围不同位置采集的,所以信号强度也不同。采集的信号强度越多,给BSSID也就是这个Wifi热点的定位就越精准。

  现在如果我去一个陌生的地方,我打开手机扫描周围的 Wifi 刚好扫描到了一个或几个,我把这个 Wifi 信息(BSSID)传给服务器,服务器通过这个 BSSID 去数据库查找,就能直接匹配到对应的位置,返回给我。如果匹配不到则表示这里没人来采集过 Wifi 信息,或者是这个 Wifi 热点是最近布置的,采集人员还没来得及采集。服务器可以把这些未采集到的先分类后期统一规划。

  Wifi 定位整体功能是需要服务端来配合的,也就表示必须要有网络环境才行。其实移动端(手机、Pad等)也可以独立完成,不过对技术和设备硬件要求会高很多,全球的 Wifi 热点是一个很庞大的数据量,需要经过高精度的无损压缩后放在内存很大的手机里才行,或许多年以后可以实现吧(即使技术上能实现了,对于产品和研发来说收益、风险、和工作量又是一场PK)

iOS 申请获取 Wifi 列表权限

  知道了原理有啥用呢,能实现么?好吧现在就遇到问题了,移动设备如今主要是 Andorid 和 iOS, Android 上可以直接扫描 Wifi 列表获取相关信息,自己去网上找找, 所以说会原理不一定会技术实现,我也就只能讲讲 iOS 的技术实现了。 
  iOS 上获取 Wifi 列表其实也有很大限制,在 iOS 9 以前是不能获取Wifi列表的,只能获取当前连接的 Wifi 信息,也就表示只有连接了 Wifi 才能定位,刚才文章说到的场景是,我在一个陌生的原理,拿出手机扫描 Wifi ,也就是我并没连接那里的 Wifi(我不知道密码我怎么连啊)。Apple 在 iOS 9 以后,提供了获取Wifi列表的API,但是获取Wifi列表是有门槛的,主要步骤有:

  • 1、向 Apple 申请开发 Network Extension 权限
  • 2、申请包含 Network Extension 的描述文件
  • 3、配置 Info.plist
  • 4、配置 entitlements
  • 5、iOS 获取 Wifi 列表代码实现
  • 6、获取Wifi列表回调

1、向 Apple 申请开发 Network Extension 权限

  首先要先写封邮件给 [email protected] ,问苹果要开发 Network Extension 的权限。 
苹果收到邮件后会自动回复邮件,在 https://developer.apple.com/contact/network-extension/ 里面填写申请表格,内容包括:

Organization:               

Company / Product URL:             

What‘s your product‘s target market?              

What‘s your company‘s primary function?             

Describe your application and how it will use the Network Extension framework.            

What type of entitlement are you requesting?                     

。。。

申请后大概两周左右能收到 Aplle的 确认信,如:

Hi, 

Thanks for your interest in the Network Extension APIs.

We added a new template containing the Network Extension entitlements to your team.

。。。。

2、申请包含 Network Extension 的描述文件

选择包含 Network Extension 的描述文件,后点击下载,下载完成双击描述文件。

3、配置 Info.plist

Xcode Info.plist 里 Required background modes 添加 一个 network-authentication(item)

4、配置 entitlements

Demo.entitlements(Demo是项目名称) 里添加 Key-Value: com.apple.developer.networking.HotspotHelper -> YES

5、iOS 获取 Wifi 列表代码实现

导入头文件

#import <NetworkExtension/NetworkExtension.h>

代码实现

- (void)getWifiList {

	if (![[[UIDevice currentDevice] systemVersion] floatValue] >= 9.0) {return;}
	dispatch_queue_t queue = dispatch_queue_create("com.leopardpan.HotspotHelper", 0);
	[NEHotspotHelper registerWithOptions:nil queue:queue handler: ^(NEHotspotHelperCommand * cmd) {
		if(cmd.commandType == kNEHotspotHelperCommandTypeFilterScanList) {
			for (NEHotspotNetwork* network  in cmd.networkList) {
				NSLog(@"network.SSID = %@",network.SSID);
			}
		}
	}];
}

kNEHotspotHelperCommandTypeFilterScanList: 表示扫描到 Wifi 列表信息。

NEHotspotNetwork 里有如下信息:

  • SSID:Wifi 名称
  • BSSID:站点的 MAC 地址
  • signalStrength: Wifi信号强度,该值在0.0-1.0之间
  • secure:网络是否安全 (不需要密码的 Wifi,该值为 false)
  • autoJoined: 设备是否自动连接该 Wifi,目前测试自动连接以前连过的 Wifi 的也为 false 。
  • justJoined:网络是否刚刚加入
  • chosenHelper:HotspotHelper是否为网络的所选助手

官方文档连接

6、获取Wifi列表回调

当你把上面的代码写完,并成功运行项目后,发现并没有Wifi列表的回调。因为你还没刷新Wifi列表,你需要:

  • 打开手机系统设置 -> WLAN -> 系统 Wifi 列表加载出来时,上面代码部分才会回调,才能获取到 Wifi 列表。

这个时候你就能看到控制台源源不断的Log。

注意事项

  • 1、获取Wifi列表功能由于是需要申请后台权限,所以能后台激活App(应用程序),而且激活后App的进程能存活几个小时。
  • 2、整个获取Wifi列表不需要App用户授权,也就是在App用户无感知下获取设备的Wifi列表信息,使用时请正当使用。
  • 3、Wifi列表获取 NetworkExtension 是 iOS 9以后才出的,目前 iOS 9 已经覆盖很广了。

下面付一张来自 TalkingData 对iOS操作系统的统计报表,时间:2017-01-03

参考资源:NEHotspotHelper NetworkExtension API iOS9.0

时间: 2024-08-06 00:10:35

Wifi 定位原理及 iOS Wifi 列表获取的相关文章

wifi定位原理

wifi定位和手机基站定位类别似,两者都需要收集wifi位置信息接入点. 其实WIFI奇妙,它靠的是侦測附近周围全部的无线网路基地台 (WiFi Access Point) 的 MAC Address (类似 10-78-D2-93-58-C2 这种格式),去比对资料库中该 MAC Address 的座标,交叉连集出所在地. 此法尚须有网路连线做资料库查询才干完毕定位. 最早开发这个技术的是Skyhook公司. 这个技术的原理是利用以下三条事实: wifi热点(也就是AP,或者无线路由器)越来越

iOS定位原理和使用建议

看到很多网友讨论iOS设备定位的问题,这里将我们所了解的关于iPhone.iPad.iPod等的定位原理做详细的介绍,希望能为大家增加知识,减少误区,更好地使用iOS设备. 介绍之前,先声明一下关于地图加加的"偏移修正"功能,地图加加可以对齐中国地区(地点.线路和照片的)坐标和中国地图之间的偏移,这个是我国测绘法规要求的一个数学意义的偏移,每个地方的偏移是固定的,法定的,和当前定位的方式.定位的精度与准确度没有任何关系.即地图加加只对齐偏移,并不能提升.降低或者改变iOS定位的速度.精

手机定位原理 - GPS/GLONASS/北斗 + WIFI + 基站

卫星定位系统 - GPS/GLONASS/北斗: 关于GPS.GLONASS.北斗.伽利略系统的科普请自行谷歌. GPS是使用最广泛的全球定位网络,几乎是所有智能手机的标配.进几年,俄罗斯的GLONASS定位功能也逐步加入智能手机芯片,与GPS组成双定位系统,定位速度大幅提升.中国自主研发的北斗导航系统,也开始出现在部分高端机型.至于欧洲的伽利略系统,目前还没有见到有哪部手机支持. 卫星定位系统的优点在于精度高,误差一般在15米以内.GPS芯片会接收天空中多颗卫星的同步信号,然后根据信号的相位差

iOS定位服务与地图开发(1)---获取经纬度

定位服务是通过GPS等方式查找定位自己的位置的,再通过地图标注出来. 在iOS中定位服务和地图开发是使用两套API分别完成的. 1.定位服务: iOS系统提供3种不同定位途径: 1>WiFi定位:通过查询一个WiFi路由器的地理位置信息,iPhone.iPod Touch.iPad都可以采用. 2>蜂窝式移动电话基站定位:通过移动运营商基站定位 3>GPS卫星定位:通过3~4颗GPS卫星位置定位,最为准确,但是耗电量大 iOS不像Android系统在定位服务编程时可以指定采用哪种途径进行

Wi-Fi定位,AP定位

Wi-Fi实时定位系统 基于Wi-Fi的无线局域网实时定位系统(Wi-Fi RTLS)结合无线局域网络(WLAN).射频识别(RFID)和实时定位等多种技术,广泛地应用在有无线局域网覆盖的区域,实现复杂的人员定位.监测和 追踪任务,并准确搜寻到目标对象,实现对人员和物品的实时定位和监控管理. 无线局域网(WLAN)介绍 无线局域网(WLAN,又称Wi-Fi)是在不采用传统电缆线的同时,提供传统有线局域网的所有功能,网络所需的基础设施不再埋在地下或隐藏在墙里,网络 却能够随着你的需要移动或变化.

Gps定位和wifi定位和基站定位的比较

现在手机定位的方式是:Gps定位,wifi定位,基站定位 Gps定位的前提,手机开启Gps定位模块,在室外,定位的精度一般是几米的范围 wifi定位的前提,手机要开启wifi,连不连上wifi热点都可以,定位的精度一般是几十米的范围 基站定位的前提,手机必须插入sim卡并且有网络信号,定位的精度一般是几百米的范围 Gps定位原理 : 采用全球定位卫星 wifi定位的原理 :假如你的家里有个自己设立的无线路由器,经常开机,你的邻居正在阳台上用手机玩谷歌地图,恰好他手机的wifi是开着的,不过没有连

百度定位SDK:弥补Android基站WIFI定位缺失

http://tech.qq.com/a/20120524/000347.htm 如今,基于位置信息的移动应用越来越多,从餐饮.购物等本地生活服务,到定向广告的匹配.移动社交网络的构建,LBS类应用的开发离不开定位功能.国内大多数的地图SDK工具,都提供了免费.精准的定位功能,方便开发者以定位功能为基础,延伸出丰富.交互体验更佳的移动应用. 不过,仅仅是地图定位功能,不少SDK工具也都支持存在着较大差别.最近,一些地图应用的开发者都碰到了这样一个难题,一个由高校学生组织的开发团队,推出了一款LB

GPS 、AGPS、LBS、WiFi定位及测试方法

一.关键知识 1.GPS是可以独立存在的,不依靠网络: 2.AGPS必须依赖GPS,如果GPS不能正常工作,AGPS无从谈起: 3.AGPS可以理解成是一个辅助工具,在GPS的基础上才有用,可用可不用,就像MM的唇膏一样: 4.AGPS必须用到网络,GPRS也好,WIFI也好: 5.AGPS是在GPS没有搜索到卫星信号的时候,先通过网络下载一个卫星的信息,将这个数据传递给GPS,GPS就可以据此直接找到卫星,省去了冷启动搜星的时间(快的几十秒,慢的几分钟): 6.AGPS在室内无效,为什么?因为

深入理解Web Server原理----在CC3200 WiFi模块上构建轻量级Web Server

作为博客园的处女作,本文将引导大家理解Web Server的原理. Table of contents 常见Web Server及其功能 低功耗WiFi 嵌入式Web Server的应用 Energia Project无缝支持Arduino框架在TI LaunchPad上的扩展 基于CC3200如何构建一个嵌入式Web Server 做过Web开发的同学都知道,Web Server是用来处理http(POST.GET.PUT.DELETE等)请求的系统,有大名鼎鼎的Apache http Ser