前言:
  非常幸运, 接触过一个与定位服务有些关联的项目. 虽不清楚定位服务内部的实现机制, 但对定位的几种方式也有较清晰的了解.
  定位不在局限于GPS, 基站这种需要硬件支持的, 基于wifi的方式更流行, 而且定位精度很高.
  但问题来了, wifi并非公共基础设施, 为何定位服务能基于wifi提供定位服务呢? 本文来简单的谈一谈其背后的故事和技术.

原理:
  定位的本质很简单: 寻找固定的参考物. 这是我个人所理解和认识的.
  当设备没GPS组件/关闭GPS功能, 往往会采用电信移动运营商的基站来定位, 如下图所示:
  
  基站的覆盖范围, 标识了用户潜在可能的位置. 基站越多, 其相交面积大大缩小了潜在位置可能性. 然而一方面单个基站的覆盖范围较大, 另一方面信号强度很难去标识有效的距离. 因此某种程度上, 定位精度与基站覆盖范围正相关. 当然基站密度和距离算法也决定定位精度, 在城市里, 精度还是很高的.
  从基站定位中, 我们可以发现一个规律: 参照物越密集, 且参照物的覆盖范围越小, 那么定位越准确.
  是否存在类似的参考物呢? 其实它就在我们身边, 那就是无线AP(wifi).
  它具有何种特点呢? 我们一一来枚举下:
  1). 无线AP位置相对固定
  2). 无线AP其有一个全球唯一的MAC地址
  3). 其信号覆盖范围半径小, 远远小于基站
  4). 无线AP的普及率高
  如果定位服务器拥有这些wifi和其位置信息, 那么上述的特点决定基于WIFI的定位更精确.
  这些wifi和位置信息是如何被定位服务商采集和利用的呢?
  一般有两种方式:
  1). 主动采集
  定位服务商, 利用街景车主动去采集街道上wifi列表和其定位的位置信息.
  2). 用户提交
  借助各类终端, 先由GPS进行精确定位, 然后收集到的附近Wifi列表, "偷偷"提交GPS的位置信息和WIFI列表. 并让之相关联. 用户越多, 数据越多, 最后简单通过提交的wifi即可确定其位置信息了.

架构:
  对于基于wifi的定位服务器, 让我们来猜测下其背后的架构.
  整理的架构大致可以分为两部分: 在线查询服务和离线数据处理服务.
  1). 在线查询服务
  其提供实时, 高可靠/高性能的定位查询服务.
  该服务可由以下几个子服务构成:
  • wifi存储服务
  其保存了wifi的 MAC/SSID 到 经纬度的映射关系, 由于MAC地址的全球唯一性. 这边可以借助key/value服务来实现, 比如HBase也是一个很适合的选择.
  • 基础地图服务
  提供了基于经纬度, 检索区县/街道, 附近商家的服务. 往往采用R-tree, M-tree等等高端的地理空间索引存储结构.
  • 位置计算服务
  依据多个参考点及相对距离, 计算一个精确经纬度位置的服务.
  其基础架构图可如下所示:
  
  注: 位置计算服务可以和服务的逻辑接入层合并.
  2). 离线数据处理服务
  该服务收集用户提交上的数据, 进行清洗(去除噪音)后, 导入wifi存储服务中.
  我不太清楚定位服务提供商, 采用的是增量更新的方式, 还是全量替换的方式. 两者都是可接受的.

总结:
  wifi定位也是种创新的定位方式, 可以说:"取之于民, 用之于民". 其背后的架构和实现, 相比之下也很简单. 最重要的估计还是基础地图服务了. 但无论如何, 其也算是一个大数据处理的案例. 大数据时代即将来临.

写在最后:
  
如果你觉得这篇文章对你有帮助, 请小小打赏下. 其实我想试试, 看看写博客能否给自己带来一点小小的收益. 无论多少, 都是对楼主一种由衷的肯定.

  

移动互联网实战--wifi定位和架构的更多相关文章

  1. 如何在Visual Studio 2017中使用C# 7+语法 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建NetCore应用框架之实战篇系列 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 NetCore入门篇:(十二)在IIS中部署Net Core程序

    如何在Visual Studio 2017中使用C# 7+语法   前言 之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法,然后闲来无事,搞着,搞着没搞出来,然后就写了这篇博文,不 ...

  2. 在Android里完美实现基站和WIFI定位

    来自:http://www.cnblogs.com/coffeegg/archive/2011/10/01/2197129.html 众所周知的,在OPhone和大部分国产的Android定制机里不支 ...

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

    http://tech.qq.com/a/20120524/000347.htm 如今,基于位置信息的移动应用越来越多,从餐饮.购物等本地生活服务,到定向广告的匹配.移动社交网络的构建,LBS类应用的 ...

  4. wifi定位原理

    wifi定位和手机基站定位类别似,两者都需要收集wifi位置信息接入点. 其实WIFI奇妙,它靠的是侦測附近周围全部的无线网路基地台 (WiFi Access Point) 的 MAC Address ...

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

    现在手机定位的方式是:Gps定位,wifi定位,基站定位 Gps定位的前提,手机开启Gps定位模块,在室外,定位的精度一般是几米的范围 wifi定位的前提,手机要开启wifi,连不连上wifi热点都可 ...

  6. Atitit.互联网 软件编程 数据库方面 架构 大牛 牛人 attilax总结

    Atitit.互联网 软件编程 数据库方面 架构 大牛 牛人 attilax总结 Coolshell 称号.理论与c++ 阮一峰:: 理论高手与js高手 王银:理论高手 赵劼,网名老赵,c#高手 与理 ...

  7. Node.js 实战 & 最佳 Express 项目架构

    Node.js 实战 & 最佳 Express 项目架构 Express Koa refs https://github.com/xgqfrms/learn-node.js-by-practi ...

  8. 移动互联网实战--Web Restful API设计和基础架构

    前言: 在移动互联网的大潮中, Web Restful API逐渐成为Web Server重要的一个分支. 移动端和服务端的交互, 主流的方式还是通过Http协议的形式来进行. 请求以Get/Post ...

  9. 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构

    本篇承接上篇内容,如果你不小心点击进来,建议重新从第一篇开始完整阅读. 构建NetCore应用框架之实战篇索引 一.BitAdminCore框架简介 从前篇论述我们知道,我们接下来将要去做一个管理系统 ...

随机推荐

  1. 运维神器Chef简单介绍和安装笔记

    首先大概解释一下Chef Chef有三个重要的概念:(如上图所示) 它们的合作关系大致是这样的, Workstation把资源或者说是一些要被运行的命令上传到Chef-Server上, Nodes自动 ...

  2. Unquotted string '"2016-07-19"'

    自己挖的坑,含泪跳进去也要填平.   ---题记 1.问题: a. 在前端使用JSON.stringify(json)转化数组对象为字符串,然后传给后台: var dateArray = new Ar ...

  3. android通知栏Notification点击,取消,清除响应事件

    主要是检测android通知栏的三种状态的响应事件 这次在实现推送需求的时候,要用到android通知栏Notification点击后进入消息页面,因为要实现一个保存推送用户名字的功能,我在点击后处理 ...

  4. python中的浅拷贝与赋值不同

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块. 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deep ...

  5. (转载) PowerDesigner 生成sql文件

    Powerdesigner15-物理模型-导出建表sql语句 博客分类: Powerdesigner Powerdesigner15-物理模型-导出建表sql语句 1.设置哪种数据库导出的sql语句, ...

  6. Github上传代码菜鸟超详细教程【转】

    最近需要将课设代码上传到Github上,之前只是用来fork别人的代码. 这篇文章写得是windows下的使用方法. 第一步:创建Github新账户 第二步:新建仓库 第三部:填写名称,简介(可选), ...

  7. 002_kafka_相关术语详细解析

    参考: http://www.cnblogs.com/likehua/p/3999538.html http://kafka.apache.org/documentation.html#getting ...

  8. 作业3---for语句及分支结构else-if

    1.本次课学习到的知识点: (1)for语句的一般表达式,执行顺序: (2)指定次序的循环程序设计:数列的累加.累乘等: (3)else-if实现的分支结构可以判断语句的真假 2.实验过程中遇到的问题 ...

  9. javascript 技巧

    1.将arguments转化为数组函数中的预定义变量arguments并非一个真正的数组,而是一个类似数组的对象. 它具有length属性,但是没有slice, push, sort等函数,那么如何使 ...

  10. iOS开发拓展篇—xib中关于拖拽手势的潜在错误

    iOS开发拓展篇—xib中关于拖拽手势的潜在错误 一.错误说明 自定义一个用来封装工具条的类 搭建xib,并添加一个拖拽的手势. 主控制器的代码:加载工具条 封装工具条以及手势拖拽的监听事件 此时运行 ...