我需要了解Wifi三角剖分的基本工作原理。场景如上图所示。为了实施wifi三角测量,我至少需要3个Wifi热点及其位置。设置: 1.为简单起见,假设我有一个 1平方公里乘1平方公里的 区域,并且在该区域有3个Wifi热点。坐标系如下:正方形区域的1个角为(0,0,0),对角最远的角将具有坐标(1,1,1)。所有位置确定都将仅相对于此坐标系完成(为简单起见,我不希望使用全局xyz坐标)。在其中,我在 (x1,y1,z1),(x2,y2,z2),(x3,y3,z3) 有3个wifi热点 。 2.我们有一个设备能够接收wifi信号并计算位置 (x,y,z)上 信号强度的人。该设备可能是电话,平板电脑等 。问题: 当您现在有以下输入时,动态地计算人的位置(x,y,z): 1.从每个人接收到的信号的信号强度wifi热点 2.以前存储在变量或数据库中的wifi热点的坐标。
第一个问题: 如何从上述输入中计算头寸?我假设信号强度与到路由器的距离成正比,但是确切的关系是什么?Skyhook如何如此准确地做到这一点? 第二个问题: 我相信上述投入已足够。还有其他要求吗?
谢谢!
这很容易。这只是一些基本的数学。将其分为两部分:
1)查找水平位置(无高度)。
要找到您的位置,您需要3分,但只需专注于2分即可。通过使用2个点,您可以自己创建一个三角形,并根据两个点之间的信号强度找到位置。这将找出您在两个路由器之间的位置。例如,如果您位于路由器3和4之间,并且与3相比,信号强度为-89,而与4相比,信号强度为-54,那么您知道自己比3更接近3。如果您对距离与信号强度进行近似估算,则可以非常准确地了解路由器3和4之间的位置。剩下的问题是确定您在3和4之间处于哪一侧。 ,因为您可能在路由器的上方或下方具有相同的信号强度值(-89,-54)(请参见示意图)
6 You could be here 3--------------------------4 You could also be here 5
然后只要找到另一个路由器,并注意您的信号强度即可。您只需看一下5个和6个路由器之间的信号强度关系即可(图中)轻松地确定要站在哪一侧。
2)您可以用高度做同样的事情。
要完成上述所有操作,您实际上仅需要距离与信号强度之间的近似值,以及路由器之间的距离即可。根据我的测试(我编写了自己的WiFi三角测量代码),跨移动设备的信号强度非常均匀,因此一台设备应具有与其相邻设备相同的结果。
我想通过Skyhook来做到这一点,要么通过GPS定位(可能是硬编码),要么是基本相同的原理。Skyhook是苹果为此批准的唯一服务,因此Apple基本上做了同样的事情,然后确保其他应用程序无法使用它(任何使用包含功能的受限80211库的iPhone应用程序都将这样做)在应用商店中被拒绝)。
编辑:如何找到距离:
您需要做一些简单的近似。根据您的环境,这些近似值可能不尽相同,因此-89英尺可能意味着您距离路由器3 15英尺,但是距路由器4则是-89英尺意味着您距离13英尺。无论您做什么,这都不会是100%准确的,但这没关系,因为您肯定可以达到5英尺之内。
因此,您要做的就是找到很多点,从路由器3的-89处获得读数,然后记下距离。然后,取一个平均值,然后使用该平均值将其放到数据库中(这表示从路由器3到-89时,您只有15英尺)。然后,对其他值(例如-50或其他值)执行此操作,然后记下您的值并找到平均值。现在,如果-89表示您距离15英尺,而-50表示您距离25英尺(仅举一个例子),那么当您从路由器3到-75时,您必须近似您的距离,除非您想得到手工近似为-75。对于成千上万的值而言,这将很繁琐,但是您必须进行实验,以查看使用尽可能少的数据点可以达到的精度。
编辑:要求代码
我在某处有代码,但是那是几年前的事,所以我必须挖掘很多东西才能找到它。我认为从概念上讲,无需代码即可轻松复制。我测试的android设备花了大约50行Java代码。
本质上,我带了一个android手机,并创建了一个应用程序,该应用程序允许我随时显示已连接的wifi设备的当前ID,其信号强度,附近的其他wifi ID及其信号强度以及GPS位置。所有这些都可以通过android的api访问。我认为您需要使用API 4或更高版本的android设备。就像3年前或4年前一样,所以我只是将其从我记忆中剔除掉。
GPS位置部分是为了使物理强度和wifi强度之间的映射更容易,而不是必须以其他方式创建我的设施的蓝图,我可以让Google地图同时为我做,因为我可以覆盖他们的地图和GPS坐标实际上是在创建距离图的同时进行的。不过,您仍然需要一个深度图来绘制楼层平面图,我们可以很容易地通过发现您是否在两个路由器之间来轻松完成此操作。我们知道同一楼层的wifi集线器的信号强度最强,然后可以通过确保到不同楼层的wifi集线器的信号较弱来进行仔细检查。该深度图本质上是wifi集线器及其各自楼层的列表。我们不需要他们的位置,因为我们可以使信号强度最适合GPS位置,所以我们在设施周围走动并抓取某些集线器的信号强度时要抓住它。这是一些简单的数学运算。因此,对于2D平面位置,从顶部向下看,我们有一堆这样的对象:
BestFitObject{ Tuple<long, long> GPSLocation; List<Tuple<WifiDevice, signedInt>> WifiReadings; //WifiDeviceName(through UUID or some other way), tupled with the signalStrength when that bestFit reading was taken } WifiDevice{ UUID ID; //Think a string should work fine, might be an internal type that encompasses UUID which woudl be better. int floorNumber; Tuple<long, long> GPSLocation; //Not entirely necessary, could provide better accuracy though }
然后,当我们对客户端设备执行ping操作并希望最适合该设备时,它会返回如下对象:
ClientPosition{ List<Tuple<UUID, signedIt> NearbySignals; //Tuple of the UUID of the wifi device and the signal strength taken during the time of the ping. }
然后,我们可以轻松地将ClientPosition最佳地拟合到使用上述两个对象创建的2D映射。
在我看来,以上内容非常简单,而深度图则更为简单。
理想情况下,您希望尝试使用包含多种不同无线技术的多种不同设备(某些设备,某些b设备,n,g等),以获得更准确的结果。但是我发现,准确性并不是什么大问题,而且您将在5英尺左右。这足够满足我的需求。理想情况下,所有wifi集线器都是相同的型号,它们通常位于大型设施/公司中,但是即使那样,这也没什么大不了的。变异是如此之小,如果您不需要疯狂的准确性,那就没关系了。